【问题标题】:Processing multiple light pixel Shader in GLSL在 GLSL 中处理多个光像素着色器
【发布时间】: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


【解决方案1】:

只需使用在线着色器工具 (http://shdr.bkcore.com/) 快速编译即可。

您可能需要将顶点着色器中的属性传递给片段着色器的变量,但我不确定,我已经有一段时间没有编写着色器了。

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

uniform mat4 modelview;
uniform mat4 normalMatrix;

uniform int lightCount;
uniform vec4 lightPosition[8];

varying vec4 vertex; //was attribute, no such thing in frag shaders
varying vec3 normal; //was attribute

varying vec4 vertColor;



void main() {  

    vec3 vertexCamera = vec3(modelview * vertex);
    vec3 transformedNormal = normalize(normalMatrix * vec4(normal,1)).xyz; //was vec3 = normalize(mat4*vec3);

float intensity = 0.0;

 for(int i = 0 ; i<8;i++){ //can't loop over a non-constant variable
    if(lightCount<i)
    { 
      vec3 direction = normalize(lightPosition[i].xyz - vertexCamera);
      intensity += max(0.0, dot(direction, transformedNormal));
    }
 }

 gl_FragColor = vec4(intensity, intensity, intensity, 1) * vertColor;
}

【讨论】:

  • 谢谢!但不工作......我已经发布了单个灯的原始工作代码。我如何才能让它与 8 盏灯一起工作?
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多