GLSL

2011-12-16 10 views
4

VC++、OpenGLの、SDLGLSL

単一クワッドジオメトリの間でスムーズなシェーディングを達成するための方法がある場合、私は疑問に思って。今、私の点光源で陰影が滑らかに見えますが、輝度は顔の対角線細分[/]に沿って上昇します。照明は、基本的には頂点間では見えません。

enter image description here

enter image description here

enter image description here

これは左から右に光が移動するように何が起こるかである

Iが表面を横切って光を移動すると、それは一貫してこれを行います。各頂点で最も明るくなり、そこからぼやけます。

私はより細かい放射状の色合いを得るために細分化を余儀なくされましたか?またはこれを回避する方法がありますか?

ヴェール

varying vec3 vertex_light_position; 
varying vec3 vertex_normal; 

void main() 
{    
    vertex_normal = normalize(gl_NormalMatrix * gl_Normal); 
    vertex_light_position = normalize(gl_LightSource[0].position.xyz); 

    gl_FrontColor = gl_Color; 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

FRAG

varying vec3 vertex_light_position; 
varying vec3 vertex_normal; 

void main() 
{ 
    float diffuse_value = max(dot(vertex_normal, vertex_light_position), 0.0); 
    gl_FragColor = gl_Color * diffuse_value; 
} 

誰もが疑問に思っている場合に私のジオメトリ:

glBegin(GL_QUADS); 
    glNormal3f(0.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(pos_x, pos_y - size_y, depth); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(pos_x + size_x, pos_y - size_y, depth); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(pos_x + size_x, pos_y, depth); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(pos_x, pos_y, depth); 
glEnd(); 
0ここで

は、私が使用していますシェーダがあります

+0

その画像は非常に小さいです。あなたは大きな大きな写真を置くことができますか? –

+0

これは1:1です。私はシリーズをアップロードしてより理にかなっています。 – grep

+0

シェーダが指向性ライトを使用しているようです。平坦な面上の指向性ライト(減衰なし)は、均一な*ライティング(サーフェス上のすべての点で同じ光強度)を生成します。それは起こっていないので、何かが間違っている必要があります。 –

答えて

5

私はいくつかのことがあります。可能性のある問題として参照してください。

私が間違っていない限り、ライトベクトルの計算にはnormalize(gl_LightSource[0].position.xyz);を使用していますが、これはライトの位置のみに基づいており、操作している頂点ではありません。つまり、そこにある値はすべての頂点で同じになり、現在のモデルビュー行列とライトの位置に基づいて変更されるだけです。私はnormalize(glLightSource[0].position.xyz - (gl_ModelViewMatrix * gl_Vertex).xyz)のような何かを行うことによって光のベクトルを計算することは、あなたが望むものに近いだろうと思うでしょう。

第2に、2つの単位ベクトルの補間が単位ベクトル自体であるとは保証されていないため、フラグメントシェーダと頂点シェーダでベクトルを正規化する必要があります。

1

私はより細かく、より放射状になるように細分化を余儀なくされましたか シェード?またはこれを回避する方法がありますか?

いいえ、あなたは何でも自由にできます。変更する必要がある唯一のコードはフラグメントシェーダです。それを試してみて、より良い結果が得られるかどうかを確認してください。

たとえば、あなたがこれを行うことができます:

diffuse_value = pow(diffuse_value, 3.0); 

hereを説明したように。

2

私は問題は光ベクトルであると思い...

私が使用することをお勧め:すべてのベクトルがすべきことを

vertex_pos = gl_ModelViewMatrix * gl_Vertex 

お知らせ:

vec3 light_vector = normalize(gl_LightSource[0].position.xyz - vertex_pos) 

vertex_posを用いて算出することができます同じ空間にいる(カメラ、世界、オブジェクト)