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);
}
이나요 :
그러므로 나는이 문제를 해결하려면 취소 간단한 전화를 필요? 버텍스 쉐이더에서는 미국식 철자를, 프래그먼트 쉐이더에서는 영국식 철자를 사용합니다. 당신은 국가를 선택해야합니다. ;) –감사합니다. 저는 다른 맞춤법을 사용했음을 눈치 채지 못했습니다. 이제이 문제가 해결되었지만 전반적인 문제는 해결되지 않았습니다. 정보 로그에서 쉐이더와 프로그램을 모두 확인하면 컴파일이나 링크시 아무런 문제가 없습니다 (철자 수정 전과 후에). –