GLSL 片段着色器错误值
GLSL Fragment Shader Bad Values
当我尝试将统一 uint 从顶点着色器传递到片段着色器时,它更改了值。如果值不是 1,我已通过更改位置确认顶点着色器中的值为 1。如果片段着色器中的值为 1,则它显示漫反射纹理而不是漫反射颜色。代码如下。此外,我尝试将其作为统一 vec2 中的值传递,但这也不起作用。
顶点着色器:
#version 410
// Layouts
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
// Uniforms (matrices)
uniform mat4 model, view, proj;
// Uniforms (texture)
uniform uint useDiffuseTexture;
// Uniforms (shininess)
uniform float shininess;
uniform float shininessStrength;
// Uniforms (colour)
uniform vec3 diffuseColour;
uniform vec3 specularColour;
// Outputs (texture)
out uint UseDiffuseTexture;
out vec2 TexCoord;
// Outputs (colour)
out vec3 DiffuseColour;
out vec3 SpecularColour;
// Outputs (shininess)
out float Shininess;
out float ShininessStrength;
void main() {
UseDiffuseTexture = useDiffuseTexture;
TexCoord = texCoord;
if(useDiffuseTexture == 1)
gl_Position = proj * view * model * vec4(position, 1.0);
else
gl_Position = vec4(position, 1.0);
}
片段着色器:
#version 410
// Inputs (texture)
in vec2 TexCoord;
uniform sampler2D diffuseTexture;
// Uniforms (texture)
uniform uint UseDiffuseTexture;
// Uniforms (colour)
uniform vec3 DiffuseColour;
uniform vec3 SpecularColour;
// Uniforms (shininess)
uniform float Shininess;
uniform float ShininessStrength;
// Output
out vec4 fragColour;
void main() {
vec4 texColour = vec4(DiffuseColour, 1.0);;
if(UseDiffuseTexture == 1)
texColour = texture(diffuseTexture, TexCoord);
if(texColour.a < 0.2)
discard;
fragColour = texColour;
}
在您声明的片段着色器中 uniform uint UseDiffuseTexture
。如果你想让它成为来自顶点着色器的值,它必须是 in uint UseDiffuseTexture
编辑
因为输入是无符号整数,所以必须用 "flat" 限定:flat in uint UseDiffuseTexture
老兄,定义错误 :D。变化
uniform uint UseDiffuseTexture;
uniform vec3 DiffuseColour;
uniform vec3 SpecularColour;
在你的片段着色器中
in uint UseDiffuseTexture;
in vec3 DiffuseColour;
in vec3 SpecularColour;
仅仅是因为您将它传递给顶点着色器,而您的片段着色器需要 4 个输入,因为您的顶点着色器有 4 个输出...
当我尝试将统一 uint 从顶点着色器传递到片段着色器时,它更改了值。如果值不是 1,我已通过更改位置确认顶点着色器中的值为 1。如果片段着色器中的值为 1,则它显示漫反射纹理而不是漫反射颜色。代码如下。此外,我尝试将其作为统一 vec2 中的值传递,但这也不起作用。
顶点着色器:
#version 410
// Layouts
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
// Uniforms (matrices)
uniform mat4 model, view, proj;
// Uniforms (texture)
uniform uint useDiffuseTexture;
// Uniforms (shininess)
uniform float shininess;
uniform float shininessStrength;
// Uniforms (colour)
uniform vec3 diffuseColour;
uniform vec3 specularColour;
// Outputs (texture)
out uint UseDiffuseTexture;
out vec2 TexCoord;
// Outputs (colour)
out vec3 DiffuseColour;
out vec3 SpecularColour;
// Outputs (shininess)
out float Shininess;
out float ShininessStrength;
void main() {
UseDiffuseTexture = useDiffuseTexture;
TexCoord = texCoord;
if(useDiffuseTexture == 1)
gl_Position = proj * view * model * vec4(position, 1.0);
else
gl_Position = vec4(position, 1.0);
}
片段着色器:
#version 410
// Inputs (texture)
in vec2 TexCoord;
uniform sampler2D diffuseTexture;
// Uniforms (texture)
uniform uint UseDiffuseTexture;
// Uniforms (colour)
uniform vec3 DiffuseColour;
uniform vec3 SpecularColour;
// Uniforms (shininess)
uniform float Shininess;
uniform float ShininessStrength;
// Output
out vec4 fragColour;
void main() {
vec4 texColour = vec4(DiffuseColour, 1.0);;
if(UseDiffuseTexture == 1)
texColour = texture(diffuseTexture, TexCoord);
if(texColour.a < 0.2)
discard;
fragColour = texColour;
}
在您声明的片段着色器中 uniform uint UseDiffuseTexture
。如果你想让它成为来自顶点着色器的值,它必须是 in uint UseDiffuseTexture
编辑
因为输入是无符号整数,所以必须用 "flat" 限定:flat in uint UseDiffuseTexture
老兄,定义错误 :D。变化
uniform uint UseDiffuseTexture;
uniform vec3 DiffuseColour;
uniform vec3 SpecularColour;
在你的片段着色器中
in uint UseDiffuseTexture;
in vec3 DiffuseColour;
in vec3 SpecularColour;
仅仅是因为您将它传递给顶点着色器,而您的片段着色器需要 4 个输入,因为您的顶点着色器有 4 个输出...