2014-11-26 2 views
3

다음 행을 추가 할 때까지 제대로 작동하는 GLSL 셰이더가 있습니다.mat4x3 vec4 곱셈에서 GLSL 컴파일이 실패합니다.

"vec4 coord = texture2D(Coordinates,gl_TexCoord[0].st);" 
"mat4x3 theMatrix;" 
"theMatrix[1][1] = 1.0;" 
"vec3 CampProj = theMatrix * coord;" 

내가이 이야기하고있는 오류 로그를 확인하는 경우 :

"ERROR: 0:2: '=' : cannot convert from '4-component vector of float' to '3-component vector of float'\n\n" 

내가 CampProject이 좋은 데 모은 vec4 할 경우,하지만 난 4 열, 3 열 행렬 곱 방법으로 매우 혼란 스러워요 4 성분 벡터에 의해 4 성분 벡터가 생길 것입니다.

이 버그입니까, 아니면 4x3 행렬이 실제로 0,0,0,1 최종 행이있는 4x4 일 수 있습니까? 컴파일러가 vec4를 반환하는 것을 왜 주장하고 있는지 누군가가 내게 설명 할 수 없습니까?

내가 VSExpress 2013, WIN7, 모바일 인텔 ® 4 시리즈 익스프레스 칩셋 제품군을 통해 C++를 사용하고

UPDATE :

레토의 대답이 나는 경우가 기대할 것입니다. 그것은 컴파일의 버그입니다. 둘 다 이것이 LA 문맥에서 의미가있는 유일한 이유이고, LA 정의는 GLSL 문서가 행렬/행렬 및 행렬/vec 곱셈에 대해 참조하는 것입니다. 그러나 비디오 칩셋 드라이버를 업데이트 한 후에도 편집 작업이 나에게 동일한 동작을하고 있습니다. Reto가 묘사하는 행동을 다른 사람이 확인할 수 있습니까?

@ 리토 12-05-14까지 아무도 확인하지 않은 경우 올바른 답을 올바른 논리적 가능성으로 받아 들일 것입니다.

+1

vec4에서 vec3으로 암시 적 변환이 수행되지 않았습니까? vec3에 의한 4x3 행렬의 멀티플렉싱은 의미가 있지만, vec4에 의한 4x3 행렬은 아닙니다. 어쩌면'coord'의 마지막 'w'좌표가 단순히 곱셈을 위해 버려지는 것입니까? http://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations – vmg

+0

@vmg : 크기가 마술처럼 4x4로 확장되고 새 행에 (0,0,0,1)이 할당 될 가능성이 큽니다. 덧붙여 말하면, 이것은 표준 준수 GLSL 구현에서 전혀 작동하지 않아야합니다. 이것은 4x3 매트릭스 * 1x4 컬럼 벡터입니다. 'vec4'의 네 번째 줄을 없애거나 4x3 행렬에 여분의 행을 추가하지 않고서는 이것을 만족시킬 방법이 없습니다 (GLSL에 의해 정의 된'mat4x3'에서'mat4' 또는'vec4'에서'vec4'' 로의 vec3 변환은 암묵적으로 변환되지 않습니다) , 어떤 일이 일어나고 있든 비표준 AFAIK입니다.) –

+0

예, 명확히 해 주셔서 감사합니다. 정확하게 'vec의 4 번째 줄을 떨어 뜨린다'는 것이 었습니다. – vmg

답변

4

이것은 GLSL 컴파일러의 버그처럼 보입니다. 이 성공적으로 컴파일해야합니다

mat4x3 mat; 
vec3 res = mat * vec4(1.0); 

이 오류 제공해야합니다 :

mat4x3 mat; 
vec4 res = mat * vec4(1.0); 

내가 3 개 구성에서이 테스트를, 그리고 그들 모두는이 동작 확인 :와

  • 윈도우 8.1 인텔 HD 그래픽 4600.
  • Windows 8.1 (NVIDIA GeForce GT 740M 포함).
  • Mac OS Yosemite with Intel Iris Pro.

이것은 또한 스펙에 대한 나의 이해와 일치합니다. GLSL 3.(강조 추가)하여

a floating-point matrix with 4 columns and 3 rows

승산이 정의된다 : 30 규격 문서 mat4x3 같이 설명

The operator is multiply (*), where both operands are matrices or one operand is a vector and the other a matrix. A right vector operand is treated as a column vector and a left vector operand as a row vector. In all these cases, it is required that the number of columns of the left operand is equal to the number of rows of the right operand. Then, the multiply (*) operation does a linear algebraic multiply, yielding an object that has the same number of rows as the left operand and the same number of columns as the right operand.

이 예에서, "왼쪽 피연산자의 열의 수는,"4 이는 벡터가 4 개의 요소가있는 열 벡터 인 "행"이 4 개 필요하다는 것을 의미합니다. 그런 다음 왼쪽 피연산자는 3 개의 행을 가지므로 결과 벡터에는 3 개의 "행"이 있으며 이는 3 개의 요소가있는 열 벡터입니다.

표준 선형 대수학을 기반으로하는 것이 유일한 것입니다.

+0

나는 이것을 지금 upvoting하고있다. 위의 Update RE : acceptance를 확인하십시오. –

+0

새로운 시스템 인 Windows 7, nVidia GTX745에서이 사실을 확인했습니다. –

0

귀하의 vec4와 mat4x3의 구성 요소 개수가 모두 4 개인 이유 때문입니다. 당신은 그 곱셈에서 vec3를받을 것으로 기대할 수 없습니다.

균질 매트릭스와 vec4를 사용하지 않는 이유는 무엇입니까? 당신이 정말로해야하는 경우이 도움이

vec3.xyz 

희망, 내 첫 번째 대답을 수행하여 VEC3로 변환 할 수 있습니다하는 vec4을 얻고,거야!

+0

4 열 3 행 행렬에 4 행 벡터를 곱한 것은 내가 알고있는 선형 대수 정의에 의해 4 성분 벡터를 생성 할 수 없습니다. –

관련 문제