【问题标题】:GLSL Shader is not compilingGLSL 着色器未编译
【发布时间】:2015-12-19 22:57:11
【问题描述】:

我正在开发一款游戏,目前正在编写一个着色器来反射来自对象的光,但我不断收到错误消息:

错误:0:25:'-' 不适用于 'vec3' 和 '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

任何帮助将不胜感激。

【问题讨论】:

  • 我们能看到完整的着色器文件吗?您可能会尝试在某处从 vec3 中减去 vec4(反之亦然)。
  • fragmentShader: pastebin.com/YQZdTDWU vertexShader: pastebin.com/CSqs02wS
  • 您应该将代码添加到问题中。否则,当 pastebin 被删除时,问题/答案不再有意义。

标签: opengl glsl


【解决方案1】:
(inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz

返回一个 vec3 (x, y, z) - 你尝试减去 worldPosition,它是 vec4 类型的。

你可以改成:

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

【讨论】:

  • 好的,我已经完成了,现在我收到以下错误:ERROR: 0:34: Too many arguments to constructor of 'vec4'
  • 并且错误发生在fragmentShader 中的out_Colour = vec4(diffuse, 1.0) * texture(textureSampler, pass_textureCoords) + vec4(finalSpecular, 1,0); 行中
  • 是的,因为在 vec4(finalSpecular, 1, 0) 中,您传递了 5 个参数(一个 vec3 和 2 个标量)。
  • 从来没有意识到我放了 5 个参数,那是小数点
  • 如果这解决了您的问题,请考虑将其标记为这样。如果您的程序运行缓慢 - 这是一个完全不同的问题,并且可能有许多原因超出了着色器的范围。它可能与着色器无关。
【解决方案2】:
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。 vec3 不能减去 vec4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多