2015-12-19 2 views
1

Я работаю над игрой, и я в настоящее время пишу шейдер для отражения света от объекта, и я получаю сообщение об ошибке:GLSL Shader не компиляции

ERROR: 0:25: '-' does not operate on 'vec3' and 'vec4'

fragmentShader файл:

vec3 unitVectorToCamera = normalize(toCameraVector); 

vec3 lightDirection = -unitLightVector; 

vertexShader файл:

toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition; 

Версия:

#version 400 core 

Любая помощь была бы принята с благодарностью.

+0

Можем ли мы увидеть полные файлы шейдеров? Вероятно, вы пытаетесь вычесть vec4 из vec3 (или наоборот). – Reigertje

+0

fragmentShader: http://pastebin.com/YQZDTDWU vertexShader: http://pastebin.com/CSqs02wS –

+2

Вы должны добавить код к вопросу. В противном случае вопрос/ответы больше не имеет смысла, когда пастебины удаляются. – BDL

ответ

3
(inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz 

Возвращает Vec3 (х, у, г) - и вы пытаетесь вычитать worldPosition, который имеет тип vec4.

Вы можете изменить его:

toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition.xyz; 
+0

Итак, я сделал это, и теперь я получаю следующую ошибку: 'ERROR: 0:34: Слишком много аргументов конструктору 'vec4'' –

+0

, и ошибка возникает в' fragmentShader' в строке, где говорится ' out_Colour = vec4 (diffuse, 1.0) * texture (textureSampler, pass_textureCoords) + vec4 (finalSpecular, 1,0); ' –

+0

Да, потому что в vec4 (finalSpecular, 1, 0) вы передаете 5 аргументов (A vec3 и 2 скаляров) , – Reigertje

0
toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition; 

worldPosition является vec4, vec4(0.0, 0.0, 0.0, 1.0)).xyz является vec3. Нельзя вычитать vec4 из vec3.