2011-01-10 3 views
1

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 좌표로

답변

1

왜 당신은 당신의 정상을 보내려면 어떻게합니까 :

normal = normalize(gl_NormalMatrix * gl_Normal); 
+0

흠을 :

glTexCoord3d(face.normals[v]->x, face.normals[v]->y, face.normals[v]->z); 

당신 쉐이더 당신이 여기 볼 수 있습니다대로하는 glNormal3d로 될 것으로 기대합니다. 그건 실수 인 것 같습니다. 나는 오늘 밤에 그것을 바꿀 것이고 어떤 일이 일어나는지 보게 될 것입니다. – Nathan

+0

또한, 왜 그것이 drawFace와 함께 쉐이더를 사용할 때 모든 것이 느려지는 것과 관련이 있다고 생각합니까? – Nathan

+0

3ds max에서 내보낼 때 삼각형이되도록 강요 했으므로 glBegin & glEnd를 face.size() 루프 외부에서 사용해 보겠습니다. 오늘 밤에 다시보고 할게. 답장을 보내 주셔서 감사합니다. – Nathan

관련 문제