2015-01-03 2 views
3

나는 직접 모드에서 벗어나려고 노력하고 있는데, Opengl에서 프로그램하는 것이 가장 좋은 방법은 아니라고 계속 말하고 있기 때문입니다. 큐브를 만들고 색상을 지정하는 자습서를 찾았지만 텍스처링은 다루지 않습니다. 이 코드는 그래서 개별적으로 각면 질감 방법 1 개 질감과 전체 모델 텍스처하는 방법을 알고 싶습니다 큐브를 만들 것입니다OpenGL : 버텍스 배열로 만든 모델을 텍스처하려면 어떻게해야합니까?

GLfloat vertices[] = { 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0,v1,v2,v3 (front) 
         1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0,v3,v4,v5 (right) 
         1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0,v5,v6,v1 (top) 
         -1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1, // v1,v6,v7,v2 (left) 
         -1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1, // v7,v4,v3,v2 (bottom) 
         1,-1,-1, -1,-1,-1, -1, 1,-1, 1, 1,-1 }; // v4,v7,v6,v5 (back) 

// normal array 
GLfloat normals[] = { 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0,v1,v2,v3 (front) 
         1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0,v3,v4,v5 (right) 
         0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0,v5,v6,v1 (top) 
         -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1,v6,v7,v2 (left) 
         0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7,v4,v3,v2 (bottom) 
         0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 }; // v4,v7,v6,v5 (back) 

// color array 
GLfloat colors[] = { 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, // v0,v1,v2,v3 (front) 
         1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, // v0,v3,v4,v5 (right) 
         1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, // v0,v5,v6,v1 (top) 
         1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, // v1,v6,v7,v2 (left) 
         0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // v7,v4,v3,v2 (bottom) 
         0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 }; // v4,v7,v6,v5 (back) 

// index array of vertex array for glDrawElements() & glDrawRangeElement() 
GLubyte indices[] = { 0, 1, 2, 2, 3, 0,  // front 
         4, 5, 6, 6, 7, 4,  // right 
         8, 9,10, 10,11, 8,  // top 
         12,13,14, 14,15,12,  // left 
         16,17,18, 18,19,16,  // bottom 
         20,21,22, 22,23,20 }; // back 

// Initialization routine. 
void setup(void) 
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); // Enable depth testing. 


} 

// Drawing routine. 
void drawScene() 
{ 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 

    // enable and specify pointers to vertex arrays 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glNormalPointer(GL_FLOAT, 0, normals); 
    glColorPointer(3, GL_FLOAT, 0, colors); 
    glVertexPointer(3, GL_FLOAT, 0, vertices); 

    glPushMatrix(); 
    glTranslatef(0, 0, -5); 

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices); 

    glPopMatrix(); 

    glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 

    glutSwapBuffers(); 
} 

// OpenGL window reshape routine. 
void resize (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60.0, (float)w/(float)h, 1.0, 20.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

// Keyboard input processing routine. 
void keyInput(unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 
     case 27: 
     exit(0); 
     break; 
     default: 
     break; 
    } 
} 

// Callback routine for non-ASCII key entry. 
void specialKeyInput(int key, int x, int y) 
{ 
    //if(key == GLUT_KEY_UP) if (step < 180) step++;; 
    //if(key == GLUT_KEY_DOWN) if (step > 0) step--;; 
    glutPostRedisplay(); 
} 

// Routine to output interaction instructions to the C++ window. 
void printInteraction(void) 
{ 
    cout << "Interaction:" << endl; 
} 

// Main routine. 
int main(int argc, char **argv) 
{ 
    printInteraction(); 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow ("sphereInBox2.cpp"); 
    setup(); 
    glutDisplayFunc(drawScene); 
    glutReshapeFunc(resize); 
    glutKeyboardFunc(keyInput); 
    glutSpecialFunc(specialKeyInput); 
    glutMainLoop(); 

    return 0; 
} 

:

는 내가 가지고있는 코드입니다. 무엇을 추천하나요?

+0

큐브의 6면 모두를 포함하는 단일 언 랩핑 텍스처에 매핑 할 텍스처 좌표 배열이 필요합니다. 'UV 매핑 '과'unwrapping '을 찾으십시오. 기술의 핵심 단어입니다. –

+0

'glEnableClientState (GL_TEXTURE_COORD_ARRAY)'와'glTexCoordPointer'에 알려 주면 힌트가 생깁니 까? ;-) – datenwolf

+0

@datenwolf \t 나는 그것들을 모두 내 프로젝트에 추가했다. coord 포인터에 대해 texcoord 변수를 만들었지 만 차이점은 없습니다. 내가 뭘 놓치고 있니? – WhyYouNoWork

답변

8

먼저 정점, 법선 및 색상과 마찬가지로 배열로 정의 할 수있는 텍스처 좌표를 제공해야합니다. 당신은 질감에 일부 배치에 해당하는 UV 좌표를 제공해야합니다큐브의 얼굴의 각 정점를 들어

GLfloat texcoords[] = { 
    0.0f, 0.0f, 
    1.0f, 0.0f, 
    1.0f, 1.0f, 
    0.0f, 1.0f, 
}; 

. 6면 모두에 대해 좌표를 제공해야하며 대부분의 경우 서로 다른 순서로 좌표를 제공해야합니다.

enter image description here

그런 다음 SOIL 같은 다른 라이브러리를 사용하여 텍스처를로드해야합니다. 그것은 나중에 OpenGL에 전달할 수있는 픽셀에 대한 포인터를 반환합니다.

다음은 OpenGL에서의 모습입니다. 먼저 새 텍스처를 생성하고 일부 매개 변수를 설정 한 다음 외부 라이브러리를 사용하여로드 한 픽셀로 채 웁니다.

glGenTextures(1, &testTexture); 
glBindTexture(GL_TEXTURE_2D, testTexture); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGB, size, size, 0, GL_RGB, GL_FLOAT, &texData[0] 
); 

마침내 당신이 활성 텍스처로 바인드해야이 텍스처로 렌더링하려면, 당신은 거의 완료

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, testTexture); 

! 하지만이 부분은 아마도 가장 복잡한 부분 일 것입니다. 셰이더를로드하고, 프로그램을 만들고, 셰이더로 컴파일하고, 프로그램 사용을 시작해야합니다. 일단 완료되면 균일 한 샘플러으로 텍스처를 전달하면됩니다.

+0

나를 찾을 수 있습니다. 텍스쳐 스코어를 이해합니다. 텍스처를 얼굴에 쓰는 것이 필요하며 이미지의 특정 비율을 텍스트에 매핑합니다. 나는 png를로드하는 몇 가지 함수를 가지고있다 : codepad.org/ygG2U0cF. 나는 다음에 무엇을해야할지 모르겠다. glActiveTexture는 정의되지 않았고 마지막 단락은 내 머리 위로지나 갔다. 더 자세히 설명해 주시겠습니까? – WhyYouNoWork

+0

@WhyYouNoWork 아마도이 훌륭한 튜토리얼 (http://learnopengl.com/#!Getting-started/Textures)을 참조 할 수 있을까요? – Iggy

+0

나는이 튜토리얼을 읽고있다. 그러나 나는 붙어있다. 나는 SOIL이 일하는 방법을 이해하지 못합니다. 나는 그 파일에 포함 된 파일 중 하나를 실행할 수 없습니다. 파일을 변환하려고 할 때 파일이 손상되었음을 계속 알려줍니다. 무슨 일이야? – WhyYouNoWork

관련 문제