在GLSL中处理多个亮像素着色器

时间:2016-01-08 13:33:13

标签: opengl glsl shader processing fragment-shader

我已经编写了一个片段着色器,只需一盏灯即可正常工作。现在我正在尝试使其适应8灯,在Processing中实现它。显然,我在数学上做错了,我看不出它是什么......我已经阅读了关于这个的其他帖子,并尝试调整我的问题的答案,但没有运气虽然...

Working with only 1 light

////片段/////

    #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 个答案:

答案 0 :(得分:1)

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

您可能需要将veretex着色器中的属性传递给片段着色器的变化,但我不确定,因为我写了着色器。

#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;
}