【发布时间】:2016-01-08 13:33:12
【问题描述】:
我已经编写了一个片段着色器,它可以很好地处理单个灯光。现在我正在尝试调整它以使用 8 个灯,在处理中实现它。显然我在数学上做错了,我看不到它是什么......我已经阅读了其他关于这个的帖子并尝试调整我的问题的答案,但没有运气......
////片段/////
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
varying vec4 vertColor;
varying vec3 ecNormal;
varying vec3 lightDir;
void main() {
vec3 direction = normalize(lightDir);
vec3 normal = normalize(ecNormal);
float intensity = max(0.0, dot(direction, normal));
gl_FragColor = vec4(intensity, intensity, intensity, 1) * vertColor;
}
////顶点/////
#define PROCESSING_LIGHT_SHADER
uniform mat4 modelview;
uniform mat4 transform;
uniform mat3 normalMatrix;
uniform vec4 lightPosition;
uniform vec3 lightNormal;
attribute vec4 vertex;
attribute vec4 color;
attribute vec3 normal;
varying vec4 vertColor;
varying vec3 ecNormal;
varying vec3 lightDir;
void main() {
gl_Position = transform * vertex;
vec3 ecVertex = vec3(modelview * vertex);
ecNormal = normalize(normalMatrix * normal);
lightDir = normalize(lightPosition.xyz - ecVertex);
vertColor = color;
}
【问题讨论】:
-
你为什么说你明明做错了什么?这段代码有什么作用?你有任何错误吗?一些不受欢迎的行为?尝试更具体。
-
这是一个简单的照明着色器,每个像素。我有一个工作的,它只支持 1 个灯。我试图让它支持 8 盏灯。好像我把循环放在不应该的地方,或者我把自己弄乱了变量。如果我运行它,它就不会编译。
-
@eneko 可能会尝试将循环修改为
for(int i = 0 ; i<8;i++){ if(i<lightCount){不确定循环制服的规则是什么? -
@eneko 如果它没有编译,你会得到什么具体的错误?
-
我明白了;无法编译片段着色器:0(24):错误 C1101:不明确的重载函数引用“mul(mat4,vec3”)(0):mat3x4 mul(mat3x1,mat1x4)(0):mat3 mul(mat3x1,mat1x3)(0) : mat3x2 mul(mat3x1, mat1x2) ...
标签: opengl glsl shader processing fragment-shader