2012-10-01 15 views
1

방금 ​​랩톱으로 렌더링 코드를 옮겼으며 OpenGL 및 glsl에 문제가 있습니다.ATI glsl 포인트 스프라이트 문제

uniform float tile_size; 

void main(void) { 
gl_PointSize = tile_size; 
// gl_PointSize = 12; 
} 

과 텍스처를 읽고 단편 색상 설정 gl_Pointcoord 사용 프래그먼트 쉐이더 :

는 I 이런 정점 셰이더 (단순화 된)을 갖는다. 다음과 같이 내 C++ 프로그램에서 내가 tile_size 결합 노력하고있어 :

glEnable(GL_TEXTURE_2D); 
glEnable(GL_POINT_SPRITE); 
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 

GLint unif_tilesize = glGetUniformLocation(*shader program*, "tile_size"); 
glUniform1f(unif_tilesize, 12); 

(그냥 같이 glUseProgram를 사용하는 프로그램이 특정 일정에 대한 단지 조각이다 내가 설정 이미했습니다 명확하게) 이제는 이런 식으로 하나의 픽셀 포인트를 얻었고 opengl이 unif_tilesize를 바인딩하지 못한다는 것을 발견했습니다 (-1로 설정 됨).

내 버텍스 쉐이더에서 의견을 교환하면 12px 포인트 스프라이트가 잘됩니다.

특히 정확한 다른 컴퓨터의 동일한 코드는 절대 작동합니다. 내 랩톱의 OpenGL 버전은 2.1.8304이고 ATI radeon x1200 (내 데스크탑의 nvidia 8800gt cf) (관련이있는 경우 ...)이 실행 중입니다.

수정 문제를 더 잘 반영하기 위해 질문 제목이 변경되었습니다.

+0

두 번째 문제는 관련된 것일 수 있습니다. 이벤트는 12px 포인트 스프라이트 렌더링 (vertex 쉐이더에서 gl_pointsize = 12 사용) 일 때 gl_PointCoord가 각 스프라이트에서 달라지는 것 같지 않습니다. – user1483596

+0

확인 했습니까? 프로그램이 성공적으로 컴파일되고 glValidateProgram과 glGetProgramiv에 의해 링크 된 경우? 너는 단 하나 위치를 위해 항상 -1을 얻는가? 컴파일러가 코드를 최적화하고 사용되지 않는 유니폼, 즉'gl_PointSize = tile_size;'행에 주석을 달 때 제외하는 것은 정상입니다. GLSL 파일의 시작 부분에 버전을 설정하려 했습니까? 또한 다른 컴퓨터 (드라이버)가 GL_PROGRAM_POINT_SIZE를 지원하는지 확인하십시오. 나는 당신과 비슷한 한때 문제가있었습니다. 밖으로 나왔어, 난 그냥 GL_PROGRAM_POINT_SIZE에 _EXT 추가 필요 :) 또한, "정의 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _합니다 _ –

+0

제안을 주셔서 감사합니다, 프로그램을 컴파일하고 잘 연결됩니다. tile_size 균일 한 위치에 대해 항상 -1을 얻습니다. 다른 유니폼 (float과 sampler2D)과 속성은 잘 묶는다. 나는 버전 번호가 없지만 변경없이 추가했다. glEnable GL_PROGRAM_POINT_SIZE, GL_PR ... _ SIZE_EXT, GL_VERTEX_PROGRAM_POINT_SIZE 및 그 조합을 시도했지만 아무 것도 작동하지 않는 것 같습니다. – user1483596

답변

1

유니폼을 설정하기 전에 glUseProgram에 전화하는 것을 잊었습니다.

+0

불편을 끼쳐 드려 죄송합니다. 이미 프로그램을 만들었으므로 유니폼을 설치하기위한 스 니펫 만 포함 시켰습니다. 내가 말했듯이, 정확히 같은 코드가 다른 컴퓨터에서 잘 작동하므로 설치가 잘되었다고 생각합니다. – user1483596

1

놀고 또 하루가 지나면 gl_PointSize에 유니폼을 바인딩 할 수 없다는 내 원래의 문제를 해결하지 못했지만 기존 점 스프라이트 렌더러를 수정했습니다. 내 ATI 카드 (구형 x1200)에서 배운 것들 중 일부를 나눌 것이라고 생각했습니다.

gl_PointSize에 대한 문제가 (적어도 내 카드에서는) 깨졌습니다. 버텍스 쉐이더에서 gl_PointSize=8.0;을 사용하여 8px 포인트 스프라이트를 얻을 수 있었지만, gl_PointSize=tile_size;을 사용하면 uniform tile_size에 바인딩하려고 시도한 모든 것이 1px 스프라이트가되었습니다.

다행히도 각 정점마다 다른 크기의 타일이 필요하지 않으므로 대신 glPointSize(tile_size)을 내 main.cpp에 호출하면 문제가 없습니다.

내 조각 쉐이더에서 gl_PointCoord이 작동하도록하려면 (즉, (0,0) 이외의 값을 반환하려면) 내 main.cpp에서 glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);을 호출해야했습니다.

내 버라이어티가 내 정점 셰이더와 조각 셰이더 사이 어딘가에서 엉망인 어리석은 문제가 계속되었습니다. 오랫동안 '관련 정보를 얻기 위해 무엇을 입력해야할까요?'라는 게임을 오래 한 후에, 누군가 당신의 쉐이더 중 적어도 하나에서 gl_TexCoord[0]을 사용하지 않는다면 누군가가 다음과 같이 말한 포럼을 발견했습니다 (그리고 즉시 잃어 버렸습니다). 변화는 손상 될 것이다.

_coord = gl_TexCoord[0].xy; 

_coord은 그렇지 않는 VEC2이다 : 내 프래그먼트 쉐이더의 마지막 라인을 추가하는 것이 해결하기 위해

. (gl_Texcoord는 다른 곳에서는 사용되지 않습니다).

이 줄이 없으면 모든 색이 파란색으로 변하고 텍스처 조회가 중단되었습니다.