0

我正在尝试使用指定的颜色和顶点来绘制三角形,但目前它似乎为位置选择了一些颜色数字并且没有做它应该做的事情

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using OpenTK.Graphics;

namespace newTriangle
{
    class Program
    {
        static void Main(string[] args)
        {
            MyWindow myWindow = new MyWindow();
            myWindow.Run();
        }
    }

    class MyWindow : GameWindow
    {
        private uint[] vertexBufferObjectIDs = new uint[2];
        private int vertexArrayID, vertexShaderID, fragmentShaderID, shaderProgramID;

        public MyWindow()
            : base(800, // Width
                600, // Height
                GraphicsMode.Default,
                "My OpenTK Window",
                GameWindowFlags.Default,
                DisplayDevice.Default,
                3, // major
                0, // minor
                GraphicsContextFlags.ForwardCompatible) { }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            GL.ClearColor(Color4.CornflowerBlue);

            GL.GenVertexArrays(1, out vertexArrayID);
            GL.BindVertexArray(vertexArrayID);

            ushort[] indices = new ushort[] { 0, 1, 2 };
            float[] vertices = new float[] {-1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
                                            0.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                                            1.0f, 1.0f, 0.0f, 0.0f, 1.0f };

            GL.GenBuffers(vertexBufferObjectIDs.Length, vertexBufferObjectIDs);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferObjectIDs[0]);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StaticDraw);

            GL.BindBuffer(BufferTarget.ElementArrayBuffer, vertexBufferObjectIDs[1]);
            GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * sizeof(ushort)), indices, BufferUsageHint.StaticDraw);

            GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, true, 5 * sizeof(float), 0);
            GL.EnableVertexAttribArray(0);

            GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, 5 * sizeof(float), 2 * sizeof(float));
            GL.EnableVertexAttribArray(1);

            vertexShaderID = GL.CreateShader(ShaderType.VertexShader);
            string vertShaderText =
                @"
                            #version 150

                            in vec3 position;
                            in vec3 colour;
                            out vec3 Colour;
                            void main()
                            {
                            Colour = colour;
                            gl_Position = vec4(position, 1) ;
                            }";

            GL.ShaderSource(vertexShaderID, vertShaderText);
            GL.CompileShader(vertexShaderID);

            fragmentShaderID = GL.CreateShader(ShaderType.FragmentShader);
            string fragShaderText =
                @"
                            #version 150
                            in vec3 Colour;
                            out vec4 outputF;
                            void main() 
                            {
                            outputF = vec4(Colour, 1.0);
                            }";
            GL.ShaderSource(fragmentShaderID, fragShaderText);
            GL.CompileShader(fragmentShaderID);

            shaderProgramID = GL.CreateProgram();
            GL.AttachShader(shaderProgramID, fragmentShaderID);
            GL.AttachShader(shaderProgramID, vertexShaderID);
            GL.LinkProgram(shaderProgramID);
            GL.UseProgram(shaderProgramID);
        }

        protected override void OnUnload(EventArgs e)
        {
            base.OnUnload(e);
            GL.DeleteBuffers(vertexBufferObjectIDs.Length, vertexBufferObjectIDs);
            GL.DeleteVertexArrays(1, ref vertexArrayID);

            GL.UseProgram(0); GL.DetachShader(shaderProgramID, vertexShaderID);
            GL.DetachShader(shaderProgramID, fragmentShaderID);
            GL.DeleteShader(fragmentShaderID);
            GL.DeleteShader(vertexShaderID);
            GL.DeleteProgram(shaderProgramID);
        }

        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);

            GL.Clear(ClearBufferMask.ColorBufferBit);

            GL.DrawElements(BeginMode.Triangles, 3, DrawElementsType.UnsignedShort, IntPtr.Zero);

            this.SwapBuffers();
        }
    }
}

谁能看到我的错误?

4

2 回答 2

0
于 2013-03-04T19:21:42.570 回答
0
vec4(position, 1)

在 GLSL 中,整数不会自动进行类型提升。

有点奇怪,因为你在片段着色器中做对了。

尝试这个:

vec4(position, 1.0)
于 2013-03-04T19:14:02.620 回答