0

我对opengl es shader和cook-torrance完全陌生,下面的shader只输出红色,没有为环境光和点光处理纹理颜色。立方体用于测试,没有应用着色器,右侧火箭有纹理没有输出,只有红色。任何opengl es家伙可以提供帮助吗? 在应用 Cook-torrance 和输出之前没有质感只有红色没有纹理只有红色 原始纹理 gl_FragColor =texture2D(texture,vertTexCoord.st).rgb*vertColor; 使用厨师托伦斯之前的原始质地但是是什么让下面的 CookTorance() 失败了?

片段着色器

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

#define PI 3.14159265

//copper
uniform vec3 diffuseColor = vec3(0.75164,0.60648,0.22648);
uniform vec3 specularColor = vec3(0.256777,0.137622,0.086014);
uniform float F0 = 0.8;
uniform float roughness = 0.1;
uniform float k = 0.2;
//uniform vec3 lightColor = vec3(1, 1, 1);
uniform sampler2D texture;


varying vec4 varyvertColor;
varying vec3 ecNormal; //eye normal
varying vec3 lightDir;
varying vec4 varyambient;
varying vec4 varyspecular;
varying float varyshininess; //0.1
varying vec4 vertTexCoord; 

varying vec4 vposition;

vec3 CookTorrance(vec3 materialDiffuseColor,
    vec3 materialSpecularColor,
    vec3 normal,
    vec3 lightDir,
    vec3 viewDir,
    vec3 lightColor)
{
    float NdotL = max(0, dot(normal, lightDir));
    float Rs = 0.0;
    if (NdotL > 0) 
    {
        vec3 H = normalize(lightDir + viewDir);
        float NdotH = max(0, dot(normal, H));
        float NdotV = max(0, dot(normal, viewDir));
        float VdotH = max(0, dot(lightDir, H));

        // Fresnel reflectance
        float F = pow(1.0 - VdotH, 5.0);
        F *= (1.0 - F0);
        F += F0;

        // Microfacet distribution by Beckmann
        float m_squared = roughness * roughness;
        float r1 = 1.0 / (4.0 * m_squared * pow(NdotH, 4.0));
        float r2 = (NdotH * NdotH - 1.0) / (m_squared * NdotH * NdotH);
        float D = r1 * exp(r2);

        // Geometric shadowing
        float two_NdotH = 2.0 * NdotH;
        float g1 = (two_NdotH * NdotV) / VdotH;
        float g2 = (two_NdotH * NdotL) / VdotH;
        float G = min(1.0, min(g1, g2));

        Rs = (F * D * G) / (PI * NdotL * NdotV);
    }
    return materialDiffuseColor * lightColor * NdotL + lightColor * materialSpecularColor * NdotL * (k + Rs * (1.0 - k));
}

void main(){
vec3 direction = normalize(lightDir);
//vec3 normal = normalize(ecNormal);
vec3 normal = -normalize(ecNormal);



vec4 vertColor =  varyambient +
        vec4(CookTorrance(texture2D(texture,vertTexCoord.st).rgb*varyvertColor.xyz,
        varyspecular.xyz*specularColor,
        vposition.xyz,
        direction,
        normal,
        varyvertColor.rgb),1.0);



gl_FragColor = vertColor;


}

上面的厨师托伦斯有什么错误吗?请帮忙。

顶点着色器

uniform mat4 modelviewMatrix;
uniform mat4 transformMatrix;
uniform mat3 normalMatrix;
uniform mat4 texMatrix;


attribute vec4 position;
attribute vec4 color;
attribute vec3 normal;

attribute vec4 ambient;
attribute vec4 specular;
attribute float shininess;

attribute vec2 texCoord;

varying vec4 vposition;
varying vec4 vertColor;
varying vec3 ecNormal;
varying vec3 lightDir;


varying vec4 varyambient;
varying vec4 varyspecular;
varying float varyshininess;
varying vec4 varyvertColor;

varying vec4 vertTexCoord;



void main() {
  // Vertex in clip coordinates
  gl_Position = transformMatrix * position;
  vposition = transformMatrix * position;

  // Vertex in eye coordinates
  vec3 ecVertex = vec3(modelviewMatrix * position);

  // Normal vector in eye coordinates
  ecNormal = normalize(normalMatrix * normal);


  varyambient=ambient;
  varyspecular=specular;
  varyshininess=shininess;

  varyvertColor=color;

  vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0);

}

4

0 回答 0