2017-02-04 5 views
-1

저는 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(); 
+0

나는 단어없이 투표를하는 "저격수에 의한 운전"을 좋아합니다 ... 그런 쾌적하고 건설적인 사람들의 무리. – nyholku

답변

0

는 문제가 좀 정적 인 데이터 구조를 초기화하는 데 사용 된 몇 가지 코드를했고 내가 생성하여 텍스처가 어떤 유효하지 않았다, 첫 번째는 OpenGL 컨텍스트에서 텍스처 세대가했던이었다 무엇인지 찾을 수 후속 문맥.