2010-08-09 2 views
1

NVIDIA Quadro 카드를 넣을 때 ATI 카드에서 잘 작동하는 OpenGL 응용 프로그램이 작동을 멈췄습니다. 텍스처는 전혀 작동하지 않습니다! 무엇을하는 흰색 쿼드OpenGL Nvidia Driver 259.12 질감이 작동하지 않습니다.

void glutDispCallback() 
{ 
//ALLOCATE TEXTURE 
unsigned char * noise = new unsigned char [32 * 32 * 3]; 
memset(noise, 255, 32*32*3); 

glEnable(GL_TEXTURE_2D); 
GLuint textureID; 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei(GL_PACK_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_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, noise); 
    delete [] noise; 

//DRAW 
glDrawBuffer(GL_BACK); 
glViewport(0, 0, 1024, 1024); 
setOrthographicProjection(); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glDisable(GL_BLEND); 
glDisable(GL_LIGHTING); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glColor4f(0,0,1,0); 
glBegin(GL_QUADS); 
    glTexCoord2f(0,0); 
    glVertex2f(-0.4,-0.4); 

    glTexCoord2f(0, 1); 
    glVertex2f(-0.4, 0.4); 

    glTexCoord2f(1, 1); 
    glVertex2f(0.4, 0.4); 

    glTexCoord2f(1,0); 
    glVertex2f(0.4,-0.4); 

glEnd(); 
glutSwapBuffers(); 

//CLEANUP 
GL_ERROR(); 
glDeleteTextures(1, &textureID); 
} 

결과는 파란색 쿼드 (또는 무엇이든은 glColor4f()에 의해 지정됩니다), 그리고 : 나는 작동하지 않는 하나의 디스플레이 기능에 내 프로그램을 줄였다 텍스처입니다. 나는 OpenGL 사이트에 FAQ를 따라왔다. 텍스처가 블렌딩 된 경우 블렌딩을 비활성화했습니다. 조명이 꺼져 있습니다. glGetError()를 통해 보았습니다 - 오류가 없습니다. 또한 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)를 설정했습니다. 및 GL_DECAL. 같은 결과. 나는 또한 다각형 와인딩 - CW와 CCW를 시도했다.

누구든지이 문제가 발생합니까?

+0

새로운 텍스처 데이터를 업로드하는 대신 모든 프레임에서 텍스처 개체를 만들고/파괴하고있는 이유는 무엇입니까? – genpfault

+0

문제를 재현하는 코드가 있습니다. 나는 현실에서 그렇게하지 않는다. – Budric

답변

1

오류가 발견되었습니다. 내 코드의 다른 곳에서 GL_TEXTURE_3D 객체를 초기화했으며 glDisable (GL_TEXTURE_3D)을 호출하지 않았습니다.

glBindTexture (GL_TEXTURE_2D, textureID)를 호출 했더라도; 현재의 텍스쳐로 2D 텍스쳐를 묶어서 사용 했어야합니다.이 코드는 항상 ATI 카드에서 작동했습니다. 분명히 nVidia 드라이버는 그렇게하지 않았습니다. 어떤 이유로 3D 텍스처를 사용하고있었습니다. 그래서 glDisable (GL_TEXTURE_3D); 문제가 해결되고 모든 것이 예상대로 작동합니다.

도움을 주신 모든 분들께 감사드립니다.

+2

그게 무슨 가치가 있는지, nvidia 드라이버가 올바른 일을합니다. 여러 대상을 사용할 수있는 경우 (여기 3D 및 2D) 규칙은 3D가 2d보다 우선합니다. 큐브> 3D> 2D> 1D. http://stackoverflow.com/questions/2784937/what-is-the-correct-behavior-when-both-a-1d-and-a-2d-texture-are-bound-in-opengl/2786948#2786948을 참조하십시오. 자세한 내용은 – Bahbar

1

glTexEnvi에서 GL_REPLACE를 사용해 볼 수 있습니까? NV 드라이버의 버그 일 수 있습니다.

+0

나는 그것을 시도했다. 내 게시물을 수정했습니다. 나는 또한 GL_MODULATE 시도했습니다. – Budric

1

코드가 정확하고 필요한 사항을 수행합니다.

memset (잡음, 255, 32 * 32 * 3); 텍스처를 흰색으로 만들지 만 glColor4f (0,0,1,0)를 호출합니다. 따라서 최종 색상은 (1,1,1) * (0,0,1) = (0,0,1) = 파란색이됩니다.

갖고 싶은 행동은 무엇입니까?

+0

GL_TEXTURE_ENV_MODE가 GL_REPLACE로 설정되고 GL_BLEND가 비활성화되어 있다면, 나는 파란색을 무시하고 그 자리에서 텍스처 색상을 사용하기를 기대합니다. 또한 왜 당신의 컬러 곱셈 연산이 올바른지 알지 못합니다. OpenGL은 어떤 모드에서 그렇게합니까? 내가 아는 혼합이 아닙니다. – Budric

+0

예, GL_REPLACE의 조각 색상은 텍스처 색상이어야합니다. –

관련 문제