Ricardo Umpierrez
Ricardo Umpierrez

Reputation: 768

OpenGL texture glTexCoord2d is not drawing

I'm having problems render a opengl texture.

I'm trying to load a texture from a png image The parser I'm using is from here https://github.com/DavidEGrayson/ahrs-visualizer/blob/master/png_texture.cpp

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

And is returning a GLuint 61964157, so seems to be working.

So, my program has a method that go through the obj and put the vertex in the array depending on the type and get a counter of the size of the array

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

Then in my display mehod call all that opengl initializers, similar to also the same repo how the init things https://github.com/DavidEGrayson/ahrs-visualizer/blob/master/ahrs-visualizer.cpp#L339

Then in my display method, who is the one called by 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.

}

Also for debugging I put a printf on the texture vertex, and seems to be feeding the glTexCoord2d with the expected values

 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 Call Stack

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 

Upvotes: 0

Views: 347

Answers (1)

derhass
derhass

Reputation: 45322

And is returning a GLuint 61964157, so seems to be working.

Nope, that's very suspicious to not actually working. While a correct implementation could come up with such a weird name, no real world implementation does that.

OpenGL Call Stack

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

Firs tof all, this isn't a call stack, but just a trace of the sequence of OpenGL calls your application did.

The real error here is that you try to create the texture inside a glBegin/glEnd block, which is not allowed. As a result, glGenTextures generates just a GL error, and leaves the texture name uninitialized, which results in some random value from your stack being used as texture name.

Aprart from those errors, your code is really horrible:

  1. You are calling glewInit inside the display function, while it should be called just once after the GL context was created.
  2. You also try to re-load the texture each frame.
  3. To make things worse, you never even delete the old texture, so you would be leaking the texture object (and memory) with each iteration.
  4. You have some glRotate and glScale calls at the end of your display function, without drawing anything with it, and overwriting that state again in the next iteration.

And for the worst part: all of that code is completely deprecated OpenGL, which will not work with modern core profiles of OpenGL. This stuff is outfdated for over a decade by now, and using the fixed-function pipeline and immediate mode rendering with Begin/End and GL's matrix stack is just not the way to go in 2017.

Upvotes: 2

Related Questions