2016-06-30 9 views
0

現在、シェーダを使用してテストシーンを構築しています。ここ は私Vertextシェーダコードです:ここでC#OpenGL - シェーダを使用してライトをカメラと一緒に移動しようとしています

public const string VertexShaderText = @" 
    #version 130 

    in vec3 vertexPosition; 
    in vec3 vertexNormal; 
    in vec3 vertexTangent; 
    in vec2 vertexUV; 

    uniform vec3 light_direction; 

    out vec3 normal; 
    out vec2 uv; 
    out vec3 light; 

    uniform mat4 projection_matrix; 
    uniform mat4 view_matrix; 
    uniform mat4 model_matrix; 
    uniform bool enable_mapping; 

    void main(void) 
    { 

     normal = normalize((model_matrix * vec4(floor(vertexNormal), 0)).xyz); 
     uv = vertexUV; 

     mat3 tbnMatrix = mat3(vertexTangent, cross(vertexTangent, normal), normal); 
     light = (enable_mapping ? light_direction * tbnMatrix : light_direction); 

     gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1); 

    } 
    "; 

は私のフラグメントシェーダです:

public const string FragmentShaderText = @" 
    #version 130 

    uniform sampler2D colorTexture; 
    uniform sampler2D normalTexture; 

    uniform bool enableToggleLighting; 
    uniform mat4 model_matrix; 
    uniform bool enable_mapping; 
    uniform float alpha; 
    uniform float ambi; 

    in vec3 normal; 
    in vec2 uv; 
    in vec3 light; 

    out vec4 fragment; 

    void main(void) 
    { 

     vec3 fragmentNormal = texture2D(normalTexture, uv).xyz * 2 - 1; 
     vec3 selectedNormal = (enable_mapping ? fragmentNormal : normal); 
     float diffuse = max(dot(selectedNormal, light), 0); 
     float ambient = ambi; 
     float lighting = (enableToggleLighting ? max(diffuse, ambient) : 1); 

     fragment = vec4(lighting * texture2D(colorTexture, uv).xyz, alpha); 
    } 
    "; 

私のプロジェクトは、このように初期化されます。

CanvasControlSettings.ShaderProgram.Use(); 
     CanvasControlSettings.ShaderProgram["projection_matrix"].SetValue(mainSceneProj); 
     CanvasControlSettings.ShaderProgram["light_direction"].SetValue(new Vector3(0f, 0f, 1f)); 
     CanvasControlSettings.ShaderProgram["enableToggleLighting"].SetValue(CanvasControlSettings.ToggleLighting); 
     CanvasControlSettings.ShaderProgram["normalTexture"].SetValue(1); 
     CanvasControlSettings.ShaderProgram["enable_mapping"].SetValue(CanvasControlSettings.ToggleNormalMapping); 

私の回転は、オブジェクトの周りにカメラを動かします。シェーディングが常に見えるように、ライトの位置をカメラとともに移動したい。

カメラポジションをシェーダに送信して実装するにはどうすればよいですか?前面から

front

回転さ:

rotated

EDIT:

GL.Light(LightName.Light0, LightParameter.Position, new float[] { CanvasControlSettings.Camera.Position.X, CanvasControlSettings.Camera.Position.Y, CanvasControlSettings.Camera.Position.Z, 0.0f }); 

次のように回転させた後、私はカメラの位置を更新しました0

そしてこの

light = gl_LightSource[0].position.xyz; 

に光のラインを変えこれはほぼ完全材料光の色は、現在の方法に鮮やかであることを受け入れて動作します!私は写真を表示するだろうが、私はより多くの担当者が必要と思われる。

EDIT:

[OK]を、提供されたリンクに従った後、私は私の道を見つけました。今完璧に動作

vec4 lightPos4 = vec4(gl_LightSource[0].position.xyz, 1.0); 
     vec4 pos4 = model_matrix * vec4(vertexPosition, 1.0); 
     light = normalize((lightPos4 - pos4).xyz); 

:私は、頂点シェーダに光コードを変更しました。ありがとう

+0

光源を移動させるだけで、世界の位置と回転をスクリプトのものと一致させることができます。 – SimpleVar

+0

私に例を挙げてもらえますか? –

+0

[this](https://www.opengl.org/discussion_boards/showthread.php/138021-Light-moving-with-camera)と[that](http://gamedev.stackexchange.com/questions/72352/)あなたの右の*方向にあなたを指し示すかもしれません。 – SimpleVar

答えて

1

シェーダにカメラの位置を送る必要はありません。ライトの位置をカメラの位置に変更し、ライトをシェーダに送ります。

関連する問題