2017-11-03 3 views
0

OpenGL 텍스처를 렌더링하는 데 문제가 있습니다. 내가 PNG 이미지 내가 사용하고 파서에서 텍스처를로드하기 위해 노력하고있어OpenGL 텍스처 glTexCoord2d가 그림이 아닙니다.

그렇게 작동하는 것 같군, https://github.com/DavidEGrayson/ahrs-visualizer/blob/master/png_texture.cpp

char str[]="bottom2.png"; 
GLuint image = png_texture_load(str, NULL, NULL); 

여기에서이다 그리고 GLuint 61964157을 반환합니다.

그래서, 내 프로그램은 OBJ 통해 이동 내 디스플레이 mehod 호출에

struct Vertice vertArrV[5000]; 
struct Vertice vertArrF[5000]; 
struct Vertice vertArrVT[5000]; 
struct Vertice vertArrVN[5000]; 

그런 다음 배열의 크기의 카운터를 유형에 따라 배열의 정점을 넣어 얻을 방법이있다 같은 REPO도 유사 모두 OpenGL을 초기화 어떻게 초기화 일 https://github.com/DavidEGrayson/ahrs-visualizer/blob/master/ahrs-visualizer.cpp#L339

void display() { // Display function will draw the image. 

    glewInit(); 

    glClearColor(0, 0, 0, 1); // (In fact, this is the default.) 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear buffers 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_TEXTURE_2D); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glBegin(GL_TRIANGLES); 

    int i=1; 
    char str[]="knight.png"; 
    GLuint image = png_texture_load(str, NULL, NULL); 

    if (image == 0) 
    { 
     printf("\n error loading texture \n"); 
     return; 
    } 

    glClearColor(1.0, 1.0, 1.0, 0.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 


for(i;i<arrayCount[2];i++){ 
    struct Vertice face =vertArrF[i]; 
    struct Vertice verticeLoop1 =vertArrV[face.vert1]; 
    struct Vertice verticeNormalLoop1 =vertArrVN[face.vertn1]; 
    struct Vertice verticeTextureLoop1 =vertArrVT[face.vertt1]; 
    struct Vertice verticeLoop2 =vertArrV[face.vert2]; 
    struct Vertice verticeNormalLoop2 =vertArrVN[face.vertn2]; 
    struct Vertice verticeTextureLoop2 =vertArrVT[face.vertt2]; 
    struct Vertice verticeLoop3 =vertArrV[face.vert3]; 
    struct Vertice verticeNormalLoop3 =vertArrVN[face.vertn3]; 
    struct Vertice verticeTextureLoop3 =vertArrVT[face.vertt3]; 


    glEnable(GL_TEXTURE_2D); 
    glBegin(GL_TRIANGLES); 
    glNormal3d(verticeNormalLoop1.x,verticeNormalLoop1.y,verticeNormalLoop1.z); 
    glTexCoord2d(verticeTextureLoop1.x, verticeTextureLoop1.y); 
    glVertex3d(verticeLoop1.x,verticeLoop1.y,verticeLoop1.z); 


    glNormal3d(verticeNormalLoop2.x,verticeNormalLoop2.y,verticeNormalLoop2.z); 
    glTexCoord2d(verticeTextureLoop2.x, verticeTextureLoop2.y); 
    glVertex3d(verticeLoop2.x,verticeLoop2.y,verticeLoop2.z); 

    glNormal3d(verticeNormalLoop3.x,verticeNormalLoop3.y,verticeNormalLoop3.z); 
    glTexCoord2d(verticeTextureLoop3.x, verticeTextureLoop3.y); 
    glVertex3d(verticeLoop3.x,verticeLoop3.y,verticeLoop3.z); 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
    GLenum err = glGetError(); 
    while (err != GL_NO_ERROR) { 
     printf("%f %f %f\n ",verticeNormalLoop1.x,verticeNormalLoop1.y); 
     printf("%f %f %f\n ",verticeNormalLoop2.x,verticeNormalLoop2.y); 
     printf("%f %f %f\n ",verticeNormalLoop3.x,verticeNormalLoop3.y); 
     printf("%f %f %f\n ",verticeLoop1.x,verticeLoop1.y); 
     printf("%f %f %f\n ",verticeLoop2.x,verticeLoop2.y); 
     printf("%f %f %f\n ",verticeLoop3.x,verticeNormalLoop3.y); 
     printf("%f %f %f\n ",verticeTextureLoop1.x,verticeTextureLoop1.y); 
     printf("%f %f %f\n ",verticeTextureLoop2.x,verticeTextureLoop2.y); 
     printf("%f %f %f\n ",verticeTextureLoop3.x,verticeTextureLoop3.y); 
     printf("error "); 
     printf("%s\n %d \n",GetGLErrorString(err), i); 
     err = glGetError(); 
    } 

} 

    glScalef(0.02,0.02,0.02); 
    glRotatef(45,1,1,0); 


    glutSwapBuffers(); // Required to copy color buffer onto the screen. 

} 
,369 glutDisplayFunc

에 의해 호출 된 하나의 내 표시 방법에서 다음

또한 디버깅을 위해 나는 질감의 정점에의 printf를 넣어 예상 값

0.863281 0.218750 0.0000000.863281 0.218750 0.0000000.863281 0.218750 0.0000000.863281 0.039062 0.0000000.863281 0.218750 0.0000000.992188 0.039062 0.0000000.730469 0.472656 0.0000000.992188 0.527344 0.0000000.875000 0.328125 0.0000000.753906 0.453125 0.0000000.875000 0.328125 0.0000000.871094 0.441406 0.0000000.863281 0.210938 0.0000000.753906 0.453125 0.0000000.753906 0.453125 0.0000000.730469 0.417969 0.0000000.730469 0.417969 0.0000000.863281 0.218750 0.0000000.863281 0.000000 0.0000000.992188 0.277344 0.0000000.992188 0.410156 0.0000000.960938 0.554688 0.0000000.871094 0.441406 0.0000000.992188 0.277344 0.0000000.992188 0.410156 0.0000000.992188 0.093750 0.0000000.992188 0.148438 0.0000000.730469 0.472656 0.0000000.871094 0.441406 0.0000000.992188 0.148438 0.0000000.992188 0.410156 0.0000000.753906 0.527344 0.0000000.753906 0.453125 0.0000000.871094 0.441406 0.0000000.753906 0.527344 0.0000000.871094 0.441406 0.0000000.992188 0.527344 0.0000000.992188 0.148438 0.0000000.960938 0.550781 0.0000000.964844 0.554688 0.0000000.164062 0.308594 0.0000000.371094 0.250000 0.0000000.382812 0.273438 0.0000000.371094 0.550781 0.0000000.218750 0.550781 0.0000000.371094 0.250000 0.0000000.382812 0.273438 0.0000000.164062 0.308594 0.0000000.960938 0.550781 0.0000000.371094 0.292969 0.0000000.382812 0.273438 0.0000000.960938 0.550781 0.0000000.960938 0.550781 0.0000000.960938 0.550781 0.0000000.960938 0.550781 0.0000000.164062 0.000000 0.0000000.175781 0.023438 0.0000000.164062 0.000000 0.0000000.175781 0.023438 0.0000000.355469 0.000000 0.0000000.355469 0.019531 0.0000000.410156 0.339844 0.0000000.175781 0.339844 0.0000000.355469 0.000000 0.0000000.355469 0.019531 0.0000000.246094 0.101562 0.0000000.246094 0.101562 0.0000000.355469 0.019531 0.0000000.378906 0.062500 0.0000000.210938 0.375000 0.0000000.382812 0.375000 0.0000000.355469 0.019531 0.0000000.378906 0.062500 0.0000000.003906 0.214844 0.0000000.003906 0.214844 0.0000000.386719 0.132812 0.0000000.378906 0.062500 0.0000000.210938 0.417969 0.0000000.386719 0.417969 0.0000000.386719 0.132812 0.0000000.378906 0.062500 0.0000000.191406 0.222656 0.0000000.191406 0.222656 0.0000000.347656 0.203125 0.0000000.386719 0.132812 0.0000000.218750 0.476562 0.0000000.378906 0.476562 0.0000000.347656 0.203125 0.0000000.386719 0.132812 0.0000000.164062 0.308594 0.0000000.164062 0.253906 0.0000000.347656 0.203125 0.0000000.371094 0.250000 0.0000000.222656 0.515625 0.0000000.375000 0.515625 0.0000000.347656 0.203125 0.0000000.371094 0.250000 0.0000000.003906 0.386719 0.0000000.371094 0.292969 0.0000000.382812 0.273438 0.0000000.003906 0.386719 0.0000000.371094 0.578125 0.0000000.218750 0.578125 0.0000000.003906 0.386719 0.0000000.003906 0.386719 0.0000000.003906 0.253906 0.0000000.003906 0.253906 0.0000000.003906 0.066406 0.0000000.003906 0.066406 0.0000000.363281 0.605469 0.0000000.226562 0.605469 0.0000000.164062 0.386719 0.0000000.320312 0.957031 0.0000000.265625 0.957031 0.0000000.226562 0.957031 0.0000000.226562 0.992188 0.0000000.410156 0.957031 0.0000000.386719 0.957031 0.0000000.386719 0.957031 0.0000000.386719 0.992188 0.0000000.363281 0.957031 0.0000000.320312 0.957031 0.0000000.960938 0.554688 0.0000000.964844 0.554688 0.0000000.960938 0.550781 0.0000000.015625 0.570312 0.0000000.082031 0.570312 0.0000000.363281 0.871094 0.0000000.328125 0.871094 0.0000000.257812 0.871094 0.0000000.328125 0.871094 0.0000000.226562 0.871094 0.0000000.226562 0.933594 0.0000000.460938 0.957031 0.0000000.437500 0.957031 0.0000000.437500 0.957031 0.0000000.437500 0.992188 0.0000000.449219 0.914062 0.0000000.386719 0.957031 0.0000000.386719 0.933594 0.0000000.410156 0.933594 0.0000000.386719 0.933594 0.0000000.074219 0.527344 0.0000000.226562 0.933594 0.0000000.226562 0.957031 0.0000000.328125 0.933594 0.0000000.257812 0.933594 0.0000000.363281 0.933594 0.0000000.328125 0.933594 0.0000000.460938 0.957031 0.0000000.480469 0.957031 0.0000000.265625 0.832031 0.0000000.265625 0.832031 0.0000000.328125 0.871094 0.0000000.449219 0.914062 0.0000000.449219 0.914062 0.0000000.015625 0.570312 0.0000000.320312 0.832031 0.0000000.156250 0.515625 0.0000000.167969 0.484375 0.0000000.210938 0.511719 0.0000000.128906 0.515625 0.0000000.960938 0.550781 0.0000000.964844 0.554688 0.0000000.109375 0.484375 0.0000000.121094 0.585938 0.0000000.128906 0.515625 0.0000000.148438 0.457031 0.0000000.148438 0.457031 0.0000000.156250 0.414062 0.0000000.156250 0.515625 0.0000000.156250 0.414062 

Result when running

OpenGL을 호출 스택

1: CGLChoosePixelFormat({kCGLPFAAllowOfflineRenderers}, 0x7fa96fd10c10, 2); 
2: CGLCreateContext(0x7fa96fd10c10, 0x00000000, 0x7fa971007600); 
3: glDrawBuffer(GL_FRONT); 
4: glReadBuffer(GL_FRONT); 
5: CGLSetParameter(0x7fa971007600, kCGLCPSwapInterval, {1}); 
6: CGLSetSurface(0x7fa971007600, {100, 78, 500, 522}, {0, 22, 500, 500}); 
7: glScissor(0, 0, 500, 500); 
8: glViewport(0, 0, 500, 500); 
9: CGLQueryRendererInfo(4294967295, 0x00000000, -1059176193); 
10: CGLDestroyRendererInfo(0x7fa96fd46710); 
11: glViewport(0, 0, 500, 500); 
12: glGetString(GL_VERSION); 
13: glGetString(GL_EXTENSIONS); 
14: glClearColor(0, 0, 0, 1); 
15: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
16: glEnable(GL_BLEND); 
17: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
18: glEnable(GL_TEXTURE_2D); 
19: glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
20: glClear(GL_COLOR_BUFFER_BIT); 
21: glBegin(GL_TRIANGLES); 
22: glGenTextures(1, 0x7fff59a00a08); 
23: glBindTexture(GL_TEXTURE_2D, 152813080); 
24: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, 0x10b856000); 
25: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
26: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
27: glClearColor(1, 1, 1, 0); 
28: glMatrixMode(GL_PROJECTION); 
29: glLoadIdentity(); 
30: glEnable(GL_TEXTURE_2D); 
31: glBegin(GL_TRIANGLES); 
32: glNormal3d(0.525731, 0.850651, 0); 
33: glTexCoord2d(0.730469, 0.257812); 
34: glVertex3d(3.48344, -1.48562, 24.4911); 
35: glNormal3d(-0.525731, 0.850651, 0); 
36: glTexCoord2d(0.992188, 0.277344); 
37: glVertex3d(3.73332, -1.23742, 20.78); 
38: glNormal3d(0.262866, -0.951056, -0.16246); 
39: glTexCoord2d(0.875, 0.328125); 
40: glVertex3d(4.60787, -3.71942, 22.2232); 
41: glEnd(); 
42: glDisable(GL_TEXTURE_2D); 
43: glGetError(); returns: GL_INVALID_OPERATION 
44: glGetError(); returns: GL_NO_ERROR 
45: glEnable(GL_TEXTURE_2D); 
46: glBegin(GL_TRIANGLES); 
47: glNormal3d(0.525731, 0.850651, 0); 
48: glTexCoord2d(0.730469, 0.257812); 
49: glVertex3d(3.48344, -1.48562, 24.4911); 
50: glNormal3d(-0.587785, 0.425325, 0.688191); 
51: glTexCoord2d(0.863281, 0.039062); 
52: glVertex3d(-1.76387, -0.741022, 22.2232); 
53: glNormal3d(-0.525731, 0.850651, 0); 
54: glTexCoord2d(0.992188, 0.277344); 
55: glVertex3d(3.73332, -1.23742, 20.78); 
56: glEnd(); 
57: glDisable(GL_TEXTURE_2D); 
58: glGetError(); returns: GL_NO_ERROR 
59: glEnable(GL_TEXTURE_2D); 
60: glBegin(GL_TRIANGLES); 
61: glNormal3d(-0.850651, -0.525731, 0); 
62: glTexCoord2d(0.992188, 0.09375); 
63: glVertex3d(-1.26412, -1.48562, 24.4911); 
64: glNormal3d(-0.442863, -0.238856, 0.864188); 
65: glTexCoord2d(0.863281, 0.09375); 
66: glVertex3d(-2.38855, -4.58812, 22.0171); 
67: glNormal3d(-0.587785, 0.425325, 0.688191); 
68: glTexCoord2d(0.992188, 0.039062); 
69: glVertex3d(-1.76387, -0.741022, 22.2232); 
70: glEnd(); 
71: glDisable(GL_TEXTURE_2D); 
72: glGetError(); returns: GL_NO_ERROR 
73: glEnable(GL_TEXTURE_2D); 
74: glBegin(GL_TRIANGLES); 
75: glNormal3d(1, 0, 0); 
76: glTexCoord2d(0.730469, 0.257812); 
77: glVertex3d(3.10864, -5.70501, 24.0788); 
78: glNormal3d(0.587785, 0.425325, 0.688191); 
79: glTexCoord2d(0.992188, 0.277344); 
80: glVertex3d(2.9837, -5.82911, 20.78); 
81: glNormal3d(-0.442863, -0.238856, 0.864188); 
82: glTexCoord2d(0.863281, 0.039062); 
83: glVertex3d(-2.38855, -4.58812, 22.0171); 
84: glEnd(); 
85: glDisable(GL_TEXTURE_2D); 
86: glGetError(); returns: GL_NO_ERROR 
87: glEnable(GL_TEXTURE_2D); 
88: glBegin(GL_TRIANGLES); 
89: glNormal3d(0.295242, 0, -0.955423); 
90: glTexCoord2d(0.863281, 0); 
91: glVertex3d(-1.63893, -4.09171, 24.4911); 
92: glNormal3d(-0.850651, -0.525731, 0); 
93: glTexCoord2d(0.992188, 0.09375); 
94: glVertex3d(-1.26412, -1.48562, 24.4911); 
95: glNormal3d(0.525731, 0.850651, 0); 
96: glTexCoord2d(0.730469, 0.472656); 
97: glVertex3d(3.48344, -1.48562, 24.4911); 
98: glEnd(); 
99: glDisable(GL_TEXTURE_2D); 
100: glGetError(); returns: GL_NO_ERROR 
+0

그러나 당신의 표제 더블 부정을 바로 잡아야했다 : 아무 것도 그리지 않는다는 것은 무언가를 그려야한다는 것을 의미한다. – Waslap

+0

그래, 네 말이 맞다. –

+0

"OpenGL Call Stack"을 보라 : 27 : glEnable (GL_TEXTURE_2D); '31 : glBegin (GL_TRIANGLES);'와'41 : glEnd();'는'0'으로 입력됩니다. 두 번째'43 : glBegin (GL_TRIANGLES);'til'53 : glEnd();'는 훨씬 더 합리적인 것처럼 보이지만 텍스처가 비활성화되어 렌더링됩니다. 나는 당신이 루프를 어떻게 든 디버깅해야한다고 생각한다. – Scheff

답변

2

와 함께 glTexCoord2d을 공급하는 것 같다 GLuint 61964157을 반환하고 있으므로 제대로 작동하는 것 같습니다.

아니요, 실제로는 작동하지 않는 것이 좋습니다. 올바른 구현에 이상한 이름이 생길 수는 있지만 실제로 구현하지는 않습니다. 모든 TOF

OpenGL을 호출 스택

[...] 
21: glBegin(GL_TRIANGLES); 
22: glGenTextures(1, 0x7fff59a00a08); 
23: glBindTexture(GL_TEXTURE_2D, 152813080); 

전나무,이 호출 스택이 아니라 OpenGL을 순서의 단지 추적 응용 프로그램이 한 호출합니다.

여기서 실제 오류는 허용되지 않는 glBegin/glEnd 블록 안에 텍스처를 만들려고한다는 것입니다. 결과적으로 glGenTextures은 GL 오류를 생성하고 텍스처 이름을 초기화되지 않은 상태로 남겨 둡니다. 결과적으로 스택의 임의 값이 텍스처 이름으로 사용됩니다. 이러한 오류에서

Aprart, 당신의 코드는 정말 끔찍 : 당신은 표시 기능 내부 glewInit 호출

  1. , 그것은 한 번만 GL 컨텍스트가 생성 된 후 호출 할 필요가있다.
  2. 또한 각 프레임마다 텍스처를 다시로드 해보십시오.
  3. 상황을 악화 시키려면 이전 텍스처를 삭제하지 않아도되므로 반복 할 때마다 텍스처 개체 (및 메모리)가 누출됩니다.
  4. 표시 기능이 끝날 때 glRotateglScale 콜을 가지고 있으며, 아무 것도 그리지 않고 다음 반복에서 해당 상태를 다시 덮어 쓰지 않습니다.

최악의 경우 : 모든 코드는 OpenGL의 최신 코어 프로파일과 호환되지 않는 완전히 폐지 된 OpenGL입니다. 이 물건들은 십여 년 넘게 에 대해 지금은이며, 고정 기능 파이프 라인과 Begin/End와 GL의 매트릭스 스택을 이용한 직접 모드 렌더링을 사용하면 2017 년에 갈 길이 멀지 않습니다.