шейдер и cook-torrance не могут выводить текстуру - PullRequest
0 голосов
/ 02 февраля 2020

Я совершенно новичок в opengl es shader и cook-torrance, следующий шейдер выводит только красный, цвет текстуры не обрабатывается для внешнего и точечного освещения. куб для тестирования, к нему не применен шейдер, правая ракета с текстурой без вывода, только красный цвет. Любой парень из opengl es может помочь? no texture only red без текстуры, только красный original texture before apply 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;


}

есть ли какая-либо ошибка в вышеупомянутом cook-torrance? помогите пожалуйста.

вершинный шейдер

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);

}

...