发布
社区首页 >问答首页 >在DrawArrays调用之后没有绘制顶点数据

在DrawArrays调用之后没有绘制顶点数据
EN

Stack Overflow用户
提问于 2016-09-15 15:20:48
回答 1查看 241关注 0票数 0

在开始使用SharpGL之后,在C#中为OpenGL使用了其他框架之后,我决定从最简单的示例开始,以确保我理解SharpGL的语法更改/细节。

因此,我试图渲染一个单一的实色三角形,这应该不会太困难。

我有两个顶点缓冲器,一个用来存储三角形的点,另一个用来存储每个点的颜色。它们是这样构建的(点一是相同的,但它使用的是点数组):

代码语言:javascript
代码运行次数:0
复制
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);

然后使用正确的attrib指针进行设置并启用:

代码语言:javascript
代码运行次数:0
复制
openGl.VertexAttribPointer(0, 3, OpenGL.GL_FLOAT, false, 0, IntPtr.Zero);
openGl.EnableVertexAttribArray(0);

但现在当我用电话抽签时:

代码语言:javascript
代码运行次数:0
复制
openGl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 3);

屏幕上什么都没有。没有例外,但背景只是空白。

当然,我认为我的着色器存在编译问题,幸运的是,SharpGL给了我一种简单的检查方法,顶点和片段着色器显示的都是正确编译和链接的。

谁能明白为什么这段代码没有正确地显示任何对象,它基本上和我以前使用过的代码相同。

资料来源:

代码语言:javascript
代码运行次数:0
复制
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);
    }
}

顶点着色器:

代码语言:javascript
代码运行次数:0
复制
#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);
}

碎片着色器:

代码语言:javascript
代码运行次数:0
复制
#version 430 core

in vec3 colour;
out vec4 frag_colour;

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-16 08:15:04

最后很简单地修正了这个问题。

我以前检查过SharpGL代码,并注意到GL_DEPTH_TEST已经启用,因此我假定GL_DEPTH_BUFFER_BIT已被正确清除,我不必这样做。

在检查了SharpGL中的呈现代码之后,发现默认情况下这不是清除的,而是将正确清除深度缓冲区的责任传递给用户。

因此,我需要一个简单的调用来清除这个问题:

this.openGl.Clear(OpenGL.GL_DEPTH_BUFFER_BIT);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39514793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档