簡體   English   中英

平面和phong陰影的問題

[英]Problems with flat and phong shading

(編輯):我發布的原始代碼是gouraud和phong着色選項。 我改了它,所以它只是phong着色並貼在下面。 網格太大,無法在此描述,因為它是從Bezier Patch生成的。

我在Open GL 3 Mesa 9中遇到了平面和陰影的一些問題。無論我做什么,我都會得到平面陰影,有小小的平面(平面),我無法讓Blinn-Phong陰影工作。

這是我的着色器:

(頂點着色器)

//material parameters

uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct;
uniform float Shininess;


attribute vec4 vPosition;
//attribute vec4 vColor;
attribute vec4 vNormal;
attribute vec4 vControlColor;
attribute vec2 texcoord;


uniform mat4 model_view;
uniform mat4 projection;

uniform int flag;
uniform int phong_flag;
uniform vec4 eye_position;

//lighting parameters
uniform vec4 light_1;               //light 1 position         
uniform vec4 light_2;               //light 2 position



varying vec4 control_color;
varying vec4 color;
varying vec4 position;
varying vec4 normal;

varying vec2 st;

void
main()
{

    control_color = vControlColor;
    position = vPosition;
    normal = vNormal;
    tex_coords = texcoord;
    st = texcoord;
    gl_Position = projection*model_view*vPosition;

}

我的片段着色器:

//material parameters

uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct;
uniform float Shininess;
uniform vec4 eye_position;

uniform int phong_flag;


//lighting parameters
uniform vec4 light_1;               //light 1 position         
uniform vec4 light_2;               //light 2 position
varying vec4 light_2_transformed;   //light 2 transformed position
uniform int Control_Point_Flag;
uniform sampler2D texMap;

varying vec4 color;
varying vec4 position;
varying vec4 normal;
varying vec4 control_color;

varying vec2 st;

void
main()
{

        vec4 N = normalize(normal);
        vec4 E = normalize(eye_position - position);
        vec4 L1 = normalize(light_1 - position);
        vec4 L2 = normalize(light_2 - position);
        vec4 H1 = normalize( L1 + E);
        vec4 H2 = normalize( L2 + E);

        //calculate ambient component
        vec4 ambient = AmbientProduct;


        //calculate diffuse componenent
        float k_d_1 = max(dot(L1,N), 0.0);
        float k_d_2 = max(dot(L2,N), 0.0);
        vec4 diffuse1 = k_d_1*DiffuseProduct;
        vec4 diffuse2 = k_d_2*DiffuseProduct;

        //calculate specular componenent
        float k_s_1 = pow(max(dot(N, H1), 0.0), Shininess);
        float k_s_2 = pow(max(dot(N, H2), 0.0), Shininess);
        vec4 specular1 = k_s_1*SpecularProduct;
        vec4 specular2 = k_s_2*SpecularProduct;   

        //if specular color is behind the camera, discard it
        if (dot(L1, N) < 0.0) {
            specular1 = vec4(0.0, 0.0, 0.0, 1.0);
        }
        if (dot(L2, N) < 0.0) {
            specular2 = vec4(0.0, 0.0, 0.0, 1.0);
        }


        vec4 final_color = ambient + diffuse1 + diffuse2 + specular1 + specular2;

        final_color.a = 1.0;

        /* gl_FragColor = final_color; */
        gl_FragColor = final_color*texture2D(texMap, st);

}

我的着色器一切都好看嗎?

值得注意的事情:

  1. 您在頂點着色器中有ModelView的變量,但在計算 position 從不使用它 因此,您的頂點“ position ”是從您的OpenGL應用程序傳遞的任何內容,並且不受您可能嘗試進行的任何轉換的影響,盡管它們在物理上正確放置,因為您使用gl_Position的矩陣。
  2. 您沒有將Normal矩陣傳遞給着色器。 通過采用ModelView矩陣的轉置逆來計算Normal矩陣。 在着色器外部計算並將其傳入。如果不將法線乘以法線矩陣,您仍然可以變換模型,但法線仍將面向相同的方式,因此您的照明會不正確的。

但是,OpenGL方面的常規向量可能是罪魁禍首。 請參閱此問題,以獲得有關不需要的平面着色的可能來源的詳細說明。

作為旁注,你的兩個着色器似乎都比它們應該更復雜。 也就是說,它們有太多未使用的變量和太多的東西,你可以壓縮成更少的行。 它只是內務管理,但它可以讓您更輕松地跟蹤代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM