gpt4 book ai didi

glsl - WebGL:glsl 属性问题,getProgramParameter 返回错误的属性数

转载 作者:行者123 更新时间:2023-12-01 09:36:15 26 4
gpt4 key购买 nike

我正在制作一个简单的 WebGL 演示。我有一个简单的顶点着色器,它需要两个属性和一些制服。代码如下:

attribute vec3 v_position;
attribute vec3 v_normal;

uniform mat4 mvMatrix;
uniform mat4 pMatrix;
uniform mat3 normalMatrix;
uniform vec3 lightPosition;



// Color to fragment program
varying vec3 transformedNormal;
varying vec3 lightDir;

void main(void)
{
// Get surface normal in eye coordinates
transformedNormal = normalMatrix * v_normal;

// Get vertex position in eye coordinates
vec4 position4 = mvMatrix * vec4(v_position.xyz,1.0);
vec3 position3 = position4.xyz / position4.w;

// Get vector to light source
lightDir = normalize(lightPosition - position3);


// Don't forget to transform the geometry!
gl_Position = pMatrix * mvMatrix * vec4(v_position.xyz,1.0);
}

当我打电话时出于某种原因

gl.getProgramParameter(shaderProgram, gl.ACTIVE_ATTRIBUTES);

当我应该得到 2 时,我得到了 1;

我不确定这里出了什么问题。如果你需要它,这是它附带的片段着色器:

#ifdef GL_ES
precision highp float;
#endif

uniform vec4 ambientColor;
uniform vec4 diffuseColor;
uniform vec4 specularColor;

varying vec3 transformedNormal;
varying vec3 lightDir;


void main(void)
{
// Dot product gives us diffuse intensity
float diff = max(0.0, dot(normalize(transformedNormal), normalize(lightDir)));

// Multiply intensity by diffuse color, force alpha to 1.0
vec4 out_color = diff * diffuseColor;

// Add in ambient light
out_color += ambientColor;


// Specular Light
vec3 vReflection = normalize(reflect(-normalize(lightDir), normalize(transformedNormal)));
float spec = max(0.0, dot(normalize(transformedNormal), vReflection));
if(diff != 0.0) {
float fSpec = pow(spec, 128.0);
out_color.rgb += vec3(fSpec, fSpec, fSpec);
}


gl_FragColor = vec4(1.0,0.0,0.0, 1.0);

}

最佳答案

我认为这是由于您的 GLSL 编译器的智能。在您的片段着色器中,您在最后一行为 gl_FragColor 分配一个常量颜色。因此,您所有出色的计算以及所有变化都会被优化掉。因此,由于 transformedNormal 已被优化掉,您也不需要在顶点着色器中计算它的值。所以你的 v_normal 属性也被优化掉了(你的 GLSL 编译器有多聪明,将两个着色器减少到一行,这不是很好吗)。这就是它被称为 ACTIVE_ATTRIBUTES 而不仅仅是 ATTRIBUTESDECLARED_ATTRIBUTES 的原因(那些常量不存在,我编造的)。

尝试将 out_color 分配给 gl_FragColor 并且什么都不会被优化掉。

关于glsl - WebGL:glsl 属性问题,getProgramParameter 返回错误的属性数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7325038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com