2016-09-15 1 views
0

C#에서 OpenGL 용 다른 프레임 워크를 사용한 후 SharpGL을 사용하기 시작하는 방법 가장 간단한 예제부터 시작하여 SharpGL의 구문 변경/세부 사항을 이해하기로 결정했습니다.DrawArrays 호출 후 정점 데이터가 그려지지 않습니다.

그래서 저는 너무 단단한 단색 삼각형을 렌더링하려고 시도하고 있습니다.

저는 두 개의 꼭지점 버퍼를 가지고 있습니다. 하나는 삼각형의 포인트를 저장하고 다른 하나는 각 포인트에 색상을 저장합니다. 이것들은 (는 점 배열을 사용하는 것을 제외하고 점 하나는 동일)과 같이 구축되어

이들은 다음 올바른 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); 

화면에 아무 것도 표시되지 않습니다. 예외는 없지만 배경은 단순히 비어 있습니다.

당연히 내 쉐이더에 편집 문제가 있다고 생각합니다. 다행히도 SharpGL은 나에게 쉬운 방법을 제공하고 Vertex 및 Fragment 셰이더 모두 올바르게 컴파일되고 링크되어 표시됩니다.

이 코드가 어떤 객체를 올바르게 표시하지 않는지 누구나 알 수 있습니까? 기본적으로 이전에 사용한 코드와 같습니다.

전체 소스 :

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

매우 간단하게 끝이 수정되었습니다.

이전에 SharpGL 코드를 검토 한 결과 GL_DEPTH_TEST이 활성화되었으므로 GL_DEPTH_BUFFER_BIT이 올바르게 삭제되었다고 가정했기 때문에이 작업을 수행 할 필요가 없었습니다.

SharpGL에서 렌더링 코드를 검토 한 결과 기본적으로이 코드가 지워지지 않고 대신 깊이 버퍼를 지우려면 사용자에게 전달됩니다. 당신이 당신의 쉐이더 컴파일 및 링크 확인

this.openGl.Clear(OpenGL.GL_DEPTH_BUFFER_BIT);

관련 문제