什么可以导致工作OpenGL渲染代码渲染黑色纹理,如果在一些其他渲染代码之后使用?

时间:2017-02-04 15:31:05

标签: opengl

我正在为FreeCAD实现HUD(即CAD视图顶部的一些图形)。

我的代码工作得很好但是如果除了我的HUD之外还有任何显示内容,即CAD文档包含一些对象,那么用纹理渲染的所有HUD元素都显示为黑色。如果出于调试目的,我用颜色渲染它们然后颜色起作用,所以我怀疑这与纹理有关。

下面是渲染的代码(这是固定的pippelin OpenGL 1.1)。

那么什么可以导致这个代码在一些其他渲染代码之后运行时将纹理呈现为黑色,但是在此之前没有其他(或很少)其他渲染进行时让它正常工作?

我该怎么调试呢?

FreeCAD代码库非常庞大,它使用的Coin3D库也非常庞大,因此查看导致此问题的原因似乎令人望而生畏。

可能是我的错,但我无法发现它。

glPushAttrib(GL_ALL_ATTRIB_BITS);
GLfloat depthrange[2];
glGetFloatv(GL_DEPTH_RANGE, depthrange);
GLdouble projectionmatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX, projectionmatrix);

glDepthMask(GL_TRUE);
glDepthRange(0.0, 1.0);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glDisable(GL_LIGHTING);
glDisable(GL_BLEND);

glEnable(GL_LIGHTING);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glShadeModel(GL_SMOOTH);

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();


const float NEARVAL = 0.1f;
const float FARVAL = 10.0f;
const float dim = NEARVAL * float(tan(M_PI / 8.0)); 
glFrustum(-dim, dim, -dim, dim, NEARVAL, FARVAL);

SbMatrix mx;
SoCamera* cam = this->getSoRenderManager()->getCamera();

mx = cam->orientation.getValue();

mx = mx.inverse();
mx[3][2] = -7.0; // Translate away from the projection point (along z axis).

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf((float*)mx);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

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

glClear(GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer( 3, GL_FLOAT, 0,(void*) g_VertexArray.data() );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer( 2, GL_FLOAT, 0, g_TextureCoordArray.data() );
glEnableClientState(GL_INDEX_ARRAY);
glIndexPointer( 2, GL_UNSIGNED_BYTE,(void*) g_IndexArray.data() );
int b=0;
int tc = (int) g_TriangleFans.size();
for (int i = 0; i < tc; i++) {
    glBindTexture(GL_TEXTURE_2D, g_Textures[g_TriangleTextures[i]]);
    int n = g_TriangleFans[i];
    glDrawArrays( GL_TRIANGLE_FAN, b, n);
    b += n;
    }

glPopMatrix();

glDepthRange(depthrange[0], depthrange[1]);
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(projectionmatrix);

glPopAttrib();

1 个答案:

答案 0 :(得分:0)

发现问题是什么,我有一些代码用于初始化一些静态数据结构,我在第一个OpenGL上下文中进行了纹理生成,因此我生成的纹理对任何后续上下文都无效。 / p>