2011-09-26 4 views
0

저는 지금 쉐이더 작업을하고 있습니다. 아주 이상한 행동을하고 있습니다. 다만 쉐이더 프로그램을 사용하여, 나는 특별한 아무것도없이이 쉐이더와 glDrawArrays(GL_POINTS,0,1000) 렌더링 모든이상한 쉐이더 손상

#version 150 

uniform float r; 
uniform float g; 
uniform float b; 
varying float retVal; 
attribute float dummyAttrib; 

void main(){ 
    retVal = dummyAttrib+r+g+b; //deleting dummyAttrib = corruption 
    gl_Position = gl_ModelViewProjectionMatrix*vec4(100,100,0,1); 
} 

첫째 :이 버텍스 쉐이더를로드했습니다. 이 셰이더를 실행하고 포인트 크기를 보이는 것으로 설정하면 화면 중간에 흰색 사각형이 보일 것입니다 (나는 glOrtho2d(0,200,0,200)을 사용하고 있습니다). DummyAttrib은 일부 속성 일 뿐이므로 내 셰이더는 실행되지 않습니다. 또한 나는 실제로 그 속성을 사용하여 일반적으로 float c = dummyAttrib과 같은 것을 할 필요가 있습니다. 또한 그것이 왜 그런지 묻고 싶습니다.

그러나 이것은 주석이있는 행 (retval=...)을 retVal = r+g+b;으로 변경하고 해당 행을 attrib (float c = dummyAttrib)로 추가하면 이상한 일이 발생합니다. 우선 여러분은 더 이상 그 사각형을 보지 않을 것입니다. 그래서 나는 무슨 일이 일어나고 있는지를보기 위해 변환 피드백을 설정해야했습니다.

필드의 각 요소에 dummyAttrib을 5로 설정하고 r = g = b = 1로 설정했습니다. 현재 코드를 사용하면 변환 피드백의 결과는 정확히 8 일 것입니다. 그러나 위와 같이 변경하면 250.128과 같은 이상한 값이 나타나며 어떻게 든 코드를 수정 (호출 순서 변경) 할 때마다이 값이 변경됩니다. 내가 그걸 dummyAttrib으로 돌려 보내 자마자 retVal의 계산은 마술처럼 수정되었습니다.

이것이 내가 쉐이더 손상의 일종이라고 생각하는 이유입니다. 저는 이전에 프로젝트에서했던 것과 동일한 쉐이더 로딩 인터페이스를 사용하고 있습니다. 그러나 이것들은 완벽 했었습니다. 그러나 셰이더를 실제로 실행하기위한 더미가 아닌 일반적인 방법으로 애트리뷰트를 사용하고있었습니다.

이 두 가지 문제가있을 수 있습니다. 요약하면 셰이더는 속성없이 실행되지 않고 셰이더는 조각 셰이더 또는 변환 피드백에 사용되는 다양한 설정에 사용되지 않으면 손상됩니다.

추신 : 나는 다음 단계로 넘어가는 데 사용되지 않는 모든 변수가 선택 해제되는 것처럼 보인다고 내 마음에 떠 올랐습니다. 이것은 속성을 선택 해제 할 수 있습니다. 그러면이 쉐이더는 속성이 없으므로 제대로 작동하지 않습니다. 이것이 운전자 잘못 일 수 있습니까? 현재 Catalyst 버전 2010.1105.19.41785가있는 Radeon 3870HD가 있습니다.

답변

1

인공 용도 (float c = dummyAttrib) 인 경우 속성이 최적화됩니다. 질문은이 경우 메쉬 준비 논리가하는 것입니다. GL에서 사용 된 속성을 쿼리하면 아무 것도 얻을 수 없습니다. 그리고 정점 속성을 전달하지 않으면 프리미티브가 그려지지 않습니다 (어떤 Catalyst에서든 Radeon 2400HD의 동작).

기본적으로, GL 보고서 속성이 전혀없는 경우 기본적으로 사용하지 않는 속성 (일부 초기화되지 않은 버퍼에 정점 당 1 바이트와 같은 것)을 전달해야합니다.

+0

다른 사용자가 속성을 사용하지 않도록 설정하면 동일한 동작이 발생하는 것을 크게 좋아합니다. 나는 처음에 여기 물었다. 그러나 어제 나는 대답이 없으면 하루 종일 촉매제를 바꿀 것이다. 그러나 속성이 선택 해제 된 경우 querry하는 방법? 나는'glGetActiveAttrib'을 사용했고 이것은 "dummyAttrib"를 이름으로 반환합니다. 또한 unitialized 버퍼에서 1 바이트를 전달하는 것을 의미합니까? 냄새는 액세스 위반과 같습니다. – Raven

+0

'glGetActiveAttrib'가 * both * cases에서'dummyAttrib'를 반환하면 미스터리처럼 보이고 ATI로 보내지는 테스트 사례가 필요합니다. _allocated_하지만 초기화되지 않은 버퍼에 버텍스 1 바이트 속성을 전달하면 액세스 위반이 발생하지 않습니다. – kvark

+0

두 번째 경우는 무엇입니까? 셰이더를 연결 한 직후에 querry합니다.그리고 초기화되지 않은 버퍼의 경우 - 지금 무슨 뜻인지 알지만, 지금하고있는 것과 다른 점은 무엇입니까 (바이트가 float보다 4 배 작음)? 실제로 GL이 비가 용성임을보고 할 때 어떻게 속성을 설정할 수 있습니까? 내장 된 속성을 통해이 작업을 수행 할 수는 있지만 그 작업을 망쳐 놓고 싶지는 않습니다. (이 이상한 버그가 충분히 있습니다.) – Raven