簡體   English   中英

OpenGL紋理glTexCoord2d未繪制

[英]OpenGL texture glTexCoord2d is not drawing

我在渲染opengl紋理時遇到問題。

我正在嘗試從png圖像加載紋理我正在使用的解析器來自這里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並根據類型將頂點放入數組中,並獲得一個數組大小的計數器

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

然后在我的顯示方法中調用所有這些opengl初始化程序,類似於同樣的倉庫如何初始化事情https://github.com/DavidEGrayson/ahrs-visualizer/blob/master/ahrs-visualizer.cpp#L339

然后在我的顯示方法中,glutDisplayFunc調用的是誰

    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.

}

同樣為了調試,我在紋理頂點上放了一個printf,似乎在給glTexCoord2d提供期望的值

 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 

運行時的結果

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 

並且正在返回GLuint 61964157,因此似乎正在工作。

不,這對於實際上沒有工作非常可疑。 雖然正確的實現可能帶有這樣一個怪異的名字,但現實世界中沒有實現。

OpenGL調用堆棧

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

首先,這不是調用堆棧,而只是應用程序執行的OpenGL調用順序的痕跡。

真正的錯誤是您嘗試在glBegin/glEnd塊內創建紋理,這是不允許的。 結果, glGenTextures只會生成一個GL錯誤,並且紋理名稱未初始化,這會導致堆棧中的一些隨機值被用作紋理名稱。

從這些錯誤中得知Aprart,您的代碼真的很可怕:

  1. 您正在顯示函數內部調用glewInit ,而在創建GL上下文后應僅調用一次。
  2. 您還嘗試在每一幀重新加載紋理。
  3. 更糟的是,您甚至都不會刪除舊紋理,因此每次迭代都會泄漏紋理對象(和內存)。
  4. 在顯示函數的末尾有一些glRotateglScale調用,沒有用它繪制任何內容,並在下一次迭代中再次覆蓋了該狀態。

最糟糕的是:所有這些代碼都是完全不推薦使用的OpenGL,它將無法與OpenGL的現代核心配置文件一起使用。 到目前為止這些東西已經過時了十年 ,並且在2017年將固定功能流水線和即時模式渲染與Begin / End和GL的矩陣堆棧一起使用並不是唯一的選擇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM