3DS Max에서 내 보낸 OBJ & MTL 파일은 완전한 체스 세트입니다. 내 최종 결과에서 게임 조각 &을 선택한 다음 사각형을 선택하여 이동하려고합니다. 내가 함께 묶는 데 문제 요소는 다음과 같습니다쉐이더를 사용하여 3D 오브젝트를 그리는 적절한 방법은 무엇입니까?
- 개체 선택
- 쉐이더
내 객체 수입 두 가지 방법으로 작업을해야합니다.
1) 모든 자료를 같은 자료와 함께 Mesh
구조체에 그룹화하고 각 프레임을 그리는 model.meshes
을 반복합니다.
2) 보드, 각 사각형, 각 게임 조각 &을 식별하고 관련 정점, 재료 등을 GroupObject
구조체에 배치합니다. 그들은 model.objects
에 배치되어 있으며 각 프레임을 그리는 과정을 반복합니다.
다음은 # 1 및 # 2에서 설명한 각 옵션의 모습입니다. SS의 상단 1/2에서 메시를 그리면 모든 음영이 올바르게 보이지만 선택할 수있는 것은 없습니다. 아래쪽 1/2에서는 게임 조각이나 정사각형을 선택할 수 있지만 모델은 쓰레기처럼 보입니다. 나는 # 2의 코드와 쉐이더를 사용하는 경우
http://img815.imageshack.us/img815/2158/chesst.png
또한, & 줌 패닝은 아래로 기어로 속도가 느려집니다. 그것은 거의 완전히 반응이 없습니다.
다음은 모든 프레임에서 개체를 그리는 데 호출되는 메서드입니다. 처음 2 개의 주석이 달린 행은 옵션 1을 시도하고 단지 내 구조체를 그려 넣습니다. Mesh
이 좋았습니다. 회전 & 확대/축소는 부드럽지만 개체를 선택할 수 없습니다. b/c Mesh
의 glPushName을 수행 할 수 없습니다. 지금 코드는 각 model.objects
을 통해 반복 설정되므로 게임 조각이나 사각형을 선택/선택하는 데 필요한 glPushName((int)object);
을 실행할 수 있습니다. 나는 시도하고 model.objects
통해 반복 할 때 매우 느린 쉐이더를 적용하는 곳 주석 부분은 여기
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//for (int i = 0; i < model.getNumberOfMeshes(); ++i)
//{
for (int i = 0; i < (int)model.objects.size(); i++)
{
ModelOBJ::GroupObject *object = model.objects[i];
glPushName((int)object);
int faceSize = (int)object->faces.size();
for (int j = 0; j < faceSize; j++)
{
ModelOBJ::Face *face = object->faces[j];
pMaterial = &model.getMaterial(face->materialId);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat *)pMaterial->ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (GLfloat *)pMaterial->diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat *)pMaterial->specular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, pMaterial->shininess * 128.0f);
glDisable(GL_TEXTURE_2D);
drawFace(*face);
//if (pMaterial->bumpMapFilename.empty())
//{
// Per fragment Blinn-Phong code path.
// glUseProgram(blinnPhongShader);
// // Bind the color map texture.
// texture = nullTexture;
// if (enableTextures)
// {
// iter = modelTextures.find(pMaterial->colorMapFilename);
// if (iter != modelTextures.end())
// texture = iter->second;
// }
// glActiveTexture(GL_TEXTURE0);
// glEnable(GL_TEXTURE_2D);
// glBindTexture(GL_TEXTURE_2D, texture);
// // Update shader parameters.
// glUniform1i(glGetUniformLocation(
// blinnPhongShader, "colorMap"), 0);
// glUniform1f(glGetUniformLocation(
// blinnPhongShader, "materialAlpha"), pMaterial->alpha);
//}
}
glPopName();
}
glBindTexture(GL_TEXTURE_2D, 0);
glUseProgram(0);
glDisable(GL_BLEND);
는 관련이 경우에 drawFace 방법입니다 (
model.mesh
년대를 반복 할 때 더 느리게 없음)
void GLEngine::drawFace(ModelOBJ::Face &face)
{
if ((int)face.numVertices <= 3)
glBegin(GL_TRIANGLES);
else
glBegin(GL_POLYGON);
for (int v = 0; v < (int)face.numVertices; v++)
{
if ((int)face.numUVWs > v && face.UVWs != NULL)
glTexCoord2f(face.UVWs[v]->x, face.UVWs[v]->y);
if ((int)face.numNormals > v && face.normals != NULL)
glTexCoord3d(face.normals[v]->x, face.normals[v]->y, face.normals[v]->z);
if ((int)face.numVertices > v && face.vertices != NULL)
glVertex3f(face.vertices[v]->x, face.vertices[v]->y, face.vertices[v]->z);
}
glEnd();
}
그리고 여기가 당신이 함께 이러한 모든 기능을 통합 할 방법
Per-fragment Blinn-Phong shader for a single directional light source.
[vert]
varying vec3 normal;
void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
[frag]
uniform sampler2D colorMap;
uniform float materialAlpha;
varying vec3 normal;
void main()
{
vec3 n = normalize(normal);
float nDotL = max(0.0, dot(n, gl_LightSource[0].position.xyz));
float nDotH = max(0.0, dot(normal, vec3(gl_LightSource[0].halfVector)));
float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess);
vec4 ambient = gl_FrontLightProduct[0].ambient;
vec4 diffuse = gl_FrontLightProduct[0].diffuse * nDotL;
vec4 specular = gl_FrontLightProduct[0].specular * power;
vec4 color = gl_FrontLightModelProduct.sceneColor + ambient + diffuse + specular;
gl_FragColor = color * texture2D(colorMap, gl_TexCoord[0].st);
gl_FragColor.a = materialAlpha;
}
을 쉐이더 사용하고 있습니까? 저의 첫 번째 생각은 모든 물질 정보가없는
model.objects
을 모두 그려서 투명하게 만드는 것입니다. 그런 다음 두 번째 루프를 실행하고 쉐이더를 사용하여 & 재료로 완성 된
model.meshes
을 모두 그립니다. 그런 다음 게임 조각을 새로운 사각형으로 옮길 때 어떻게 조각의 새로운 위치에 적절한 음영이 적용되는지 어떻게 알 수 있습니까? 투명
GroupObject
을 선택하고 새 사각형으로 변환하면 조각에 여전히 적절한 음영이 나타 납니까?
내가 겪고있는 문제를 해결하는 가장 좋은 방법은 무엇입니까?텍스처가 GLEngine::drawFace
좌표로
흠을 :
당신 쉐이더 당신이 여기 볼 수 있습니다대로하는
glNormal3d
로 될 것으로 기대합니다. 그건 실수 인 것 같습니다. 나는 오늘 밤에 그것을 바꿀 것이고 어떤 일이 일어나는지 보게 될 것입니다. – Nathan또한, 왜 그것이 drawFace와 함께 쉐이더를 사용할 때 모든 것이 느려지는 것과 관련이 있다고 생각합니까? – Nathan
3ds max에서 내보낼 때 삼각형이되도록 강요 했으므로 glBegin & glEnd를 face.size() 루프 외부에서 사용해 보겠습니다. 오늘 밤에 다시보고 할게. 답장을 보내 주셔서 감사합니다. – Nathan