저는 FreeCAD를위한 HUD를 구현하고 있습니다. (즉, CAD 뷰 위에 그래픽이 있습니다.)다른 렌더링 코드 후에 OpenGL 렌더링 코드를 사용하면 검은 텍스처가 렌더링 될 수 있습니까?
내 코드는 훌륭하게 작동하지만 내 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();
나는 단어없이 투표를하는 "저격수에 의한 운전"을 좋아합니다 ... 그런 쾌적하고 건설적인 사람들의 무리. – nyholku