2016-09-15 19 views
0

C#でOpenGL用の他のフレームワークを使用した後でSharpGLを使い始める最も簡単な例から始めて、SharpGLの文法の変更/細部を理解することにしました。DrawArraysコール後に頂点データが描画されない

私はあまりにも困難ではない単一の色付きの三角形をレンダリングしようとしています。

私は2つの頂点バッファを持っています。一つは、三角形の点を格納し、もう一つは、各点に色を格納します。これらは、(それがポイントの配列を使用する以外の点1が同じである)ので、同様に構築されています

その後、これらは正しいATTRIBポインタを設定し、有効になっている
var colorsVboArray = new uint[1]; 
openGl.GenBuffers(1, colorsVboArray); 
openGl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, colorsVboArray[0]); 
this.colorsPtr = GCHandle.Alloc(this.colors, GCHandleType.Pinned).AddrOfPinnedObject(); 
openGl.BufferData(OpenGL.GL_ARRAY_BUFFER, this.colors.Length * Marshal.SizeOf<float>(), this.colorsPtr, 
      OpenGL.GL_STATIC_DRAW); 

:今

openGl.VertexAttribPointer(0, 3, OpenGL.GL_FLOAT, false, 0, IntPtr.Zero); 
openGl.EnableVertexAttribArray(0); 

しかしを私は電話を使って描画します:

openGl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 3); 

私は画面上に何も得られません。例外はありませんが、背景は単に空白です。

私のシェーダにはコンパイルの問題があると私は推測しましたが、幸いなことにシャープGLは簡単なチェック方法を提供し、頂点シェーダとフラグメントシェイダーは正しくコンパイルされリンクされています。

このコードでオブジェクトが正しく表示されない理由は誰でも知ることができますが、基本的にはこれまで使用していたコードと同じです。

完全なソース:

internal class Triangle 
{ 
    private readonly float[] colors = new float[9]; 

    private readonly ShaderProgram program; 

    private readonly float[] trianglePoints = 
    { 
     0.0f, 0.5f, 0.0f, 
     0.5f, -0.5f, 0.0f, 
     -0.5f, -0.5f, 0.0f 
    }; 

    private IntPtr colorsPtr; 

    private IntPtr trianglePointsPtr; 

    private readonly VertexBufferArray vertexBufferArray; 

    public Triangle(OpenGL openGl, SolidColorBrush solidColorBrush) 
    { 

     for (var i = 0; i < this.colors.Length; i+=3) 
     { 
      this.colors[i] = solidColorBrush.Color.R/255.0f; 
      this.colors[i + 1] = solidColorBrush.Color.G/255.0f; 
      this.colors[i + 2] = solidColorBrush.Color.B/255.0f; 
     } 

     this.vertexBufferArray = new VertexBufferArray(); 
     this.vertexBufferArray.Create(openGl); 
     this.vertexBufferArray.Bind(openGl); 

     var colorsVboArray = new uint[1]; 
     openGl.GenBuffers(1, colorsVboArray); 
     openGl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, colorsVboArray[0]); 
     this.colorsPtr = GCHandle.Alloc(this.colors, GCHandleType.Pinned).AddrOfPinnedObject(); 
     openGl.BufferData(OpenGL.GL_ARRAY_BUFFER, this.colors.Length * Marshal.SizeOf<float>(), this.colorsPtr, 
      OpenGL.GL_STATIC_DRAW); 

     var triangleVboArray = new uint[1]; 
     openGl.GenBuffers(1, triangleVboArray); 
     openGl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, triangleVboArray[0]); 
     this.trianglePointsPtr = GCHandle.Alloc(this.trianglePoints, GCHandleType.Pinned).AddrOfPinnedObject(); 
     openGl.BufferData(OpenGL.GL_ARRAY_BUFFER, this.trianglePoints.Length * Marshal.SizeOf<float>(), this.trianglePointsPtr, 
      OpenGL.GL_STATIC_DRAW); 

     openGl.BindBuffer(OpenGL.GL_ARRAY_BUFFER,triangleVboArray[0]); 
     openGl.VertexAttribPointer(0, 3, OpenGL.GL_FLOAT, false, 0, IntPtr.Zero); 
     openGl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, colorsVboArray[0]); 
     openGl.VertexAttribPointer(1, 3, OpenGL.GL_FLOAT, false, 0, IntPtr.Zero); 

     openGl.EnableVertexAttribArray(0); 
     openGl.EnableVertexAttribArray(1); 

     var vertexShader = new VertexShader(); 
     vertexShader.CreateInContext(openGl); 
     vertexShader.SetSource(new StreamReader(
       Assembly.GetExecutingAssembly() 
        .GetManifestResourceStream(@"OpenGLTest.Shaders.Background.SolidColor.SolidColorVertex.glsl")) 
      .ReadToEnd()); 
     vertexShader.Compile(); 

     var fragmentShader = new FragmentShader(); 
     fragmentShader.CreateInContext(openGl); 
     fragmentShader.SetSource(new StreamReader(
       Assembly.GetExecutingAssembly() 
        .GetManifestResourceStream(@"OpenGLTest.Shaders.Background.SolidColor.SolidColorFragment.glsl")) 
      .ReadToEnd()); 
     fragmentShader.Compile(); 

     this.program = new ShaderProgram(); 
     this.program.CreateInContext(openGl); 
     this.program.AttachShader(vertexShader); 
     this.program.AttachShader(fragmentShader); 
     this.program.Link(); 
    } 

    public void Draw(OpenGL openGl) 
    { 
     this.program.Push(openGl, null); 
     this.vertexBufferArray.Bind(openGl); 
     openGl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 3); 
     this.program.Pop(openGl, null); 
    } 
} 

バーテックスシェーダ:

#version 430 core 

layout(location = 0) in vec3 vertex_position; 
layout(location = 1) in vec3 vertex_color; 

out vec3 color; 

void main() 
{ 
    color = vertex_color; 
    gl_Position = vec4(vertex_position, 1.0); 
} 

フラグメントシェーダ:

#version 430 core 

in vec3 colour; 
out vec4 frag_colour; 

void main() 
{ 
    frag_colour = vec4 (colour, 1.0); 
} 
+0

あなたのシェーダをコンパイルすることを確認し、リンクしましたが?頂点シェーダでアメリカのスペルを使用し、フラグメントシェーダでイギリスのスペルを使用していることに気付きました。あなたは国を選ぶ必要があります。 ;) –

+0

ありがとうございました私は、私は今修正されている別のスペルを使用して気づいていないが、それは私の全体的な問題を解決しませんでした。情報ログでシェーダとプログラムの両方をチェックすると、コンパイルやリンクに問題はありません(これはスペルチェックの前後です)。 –

答えて

0

はかなり単純に最後にこれを修正しました。

私はシャープGLコードを以前にレビューしており、GL_DEPTH_TESTが有効になっていると指摘していたので、GL_DEPTH_BUFFER_BITが正しくクリアされていると推測していました。

SharpGLのレンダリングコードを確認したところ、デフォルトではクリアされていませんでしたが、深度バッファを正しくクリアするためにユーザーに渡されます。

そこで私はこの問題を解決するためにクリアする単純なコールに必要な:

this.openGl.Clear(OpenGL.GL_DEPTH_BUFFER_BIT);

関連する問題