Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-OpenGl.Net着色器无法编译且没有错误_C#_Opengl - Fatal编程技术网

C#-OpenGl.Net着色器无法编译且没有错误

C#-OpenGl.Net着色器无法编译且没有错误,c#,opengl,C#,Opengl,我正在使用C#和OpenGL.Net制作一个简单的程序来显示一个三角形,但由于某种原因,该程序运行时会将屏幕留空。它表示顶点着色器和片段着色器都未能编译,但没有错误列表 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Threading; using System.Text; using SFML; using

我正在使用C#和OpenGL.Net制作一个简单的程序来显示一个三角形,但由于某种原因,该程序运行时会将屏幕留空。它表示顶点着色器和片段着色器都未能编译,但没有错误列表

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
using System.Text;

using SFML;
using SFML.Graphics;
using SFML.Window;
using OpenGL;

using System.Media;
using System.IO;

namespace SFML_Test
{
    static class Program
    {
        static void Main()
        {
            // Create the main window
            ContextSettings settings = new ContextSettings
            {
                DepthBits = 24,
                StencilBits = 8,
                AntialiasingLevel = 2 // optional
            };
            RenderWindow window = new RenderWindow(new VideoMode(800, 600), "SFML Works!");
            window.Closed += new EventHandler(OnClose);

            Color windowColor = new Color(0, 0, 0);
            // Setup
            uint vao = Gl.GenVertexArray();
            Gl.BindVertexArray(vao);

            float[] trianglePoints = 
                { -0.5F, -0.5F,
                0.5F, -0.5F,
                0F, 0.5F};
            uint vbo = Gl.GenBuffer();
            Gl.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            Gl.BufferData(BufferTarget.ArrayBuffer, (uint)(4*trianglePoints.Length), trianglePoints, BufferUsage.StaticDraw);
            SetupVertexShader();

            Gl.EnableVertexAttribArray(0);
            Gl.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            Gl.VertexAttribPointer(0, 3, VertexAttribType.Float, false, 0, (IntPtr)0);
            Gl.DrawArrays(OpenGL.PrimitiveType.Triangles, 0, 3);
            // Start the game loop
            while (window.IsOpen())
            {
                window.DispatchEvents();
                window.Clear(windowColor);
                Gl.DrawElements(OpenGL.PrimitiveType.Triangles, 3, DrawElementsType.UnsignedInt, 0);

                Thread.Sleep((1/30) * 1000);
                window.Display();
            }
        }
        static void SetupVertexShader()
        {
            uint vertexShader = Gl.CreateShader(ShaderType.VertexShader);
            string[] shaderString = File.ReadAllLines(@".\Shaders\vertex.shader");
            Gl.ShaderSource(vertexShader, shaderString);
            Gl.CompileShader(vertexShader);
            int success;
            Gl.GetShader(vertexShader, ShaderParameterName.CompileStatus, out success);
            if (success != 0)
            {
                Console.WriteLine("Vertex Creation Success.");
            }
            else
            {
                Console.WriteLine("Vertex creation fail.");
                Gl.GetShader(vertexShader, ShaderParameterName.InfoLogLength, out int logLength);
                int logMaxLength = 1024;
                StringBuilder infoLog = new StringBuilder(logMaxLength);
                Gl.GetShaderInfoLog(vertexShader, 1024, out int infoLogLength, infoLog);
                Console.WriteLine("Errors: \n{0}", infoLog.ToString());
            }
            uint fragmentShader = Gl.CreateShader(ShaderType.FragmentShader);
            Gl.ShaderSource(fragmentShader, File.ReadAllLines(@".\Shaders\fragment.shader"));
            Gl.CompileShader(fragmentShader);
            Gl.GetShader(fragmentShader, ShaderParameterName.CompileStatus, out success);
            if (success != 0)
            {
                Console.WriteLine("Fragment Creation Success.");
            }
            else
            {
                Console.WriteLine("Fragment creation fail.");
                Gl.GetShader(fragmentShader, ShaderParameterName.InfoLogLength, out int logLength);
                int logMaxLength = 1024;
                StringBuilder infoLog = new StringBuilder(logMaxLength);
                Gl.GetShaderInfoLog(vertexShader, 1024, out int infoLogLength, infoLog);
                Console.WriteLine("Errors: \n{0}", infoLog);
            }
            uint shaderProgram = Gl.CreateProgram();
            Gl.AttachShader(shaderProgram, vertexShader);
            Gl.AttachShader(shaderProgram, fragmentShader);
            Gl.BindFragDataLocation(shaderProgram, 0, "outColor");
            Gl.LinkProgram(shaderProgram);
            Gl.UseProgram(shaderProgram);
        }
        static void OnClose(object sender, EventArgs e)
        {
            // Close window
            RenderWindow window = (RenderWindow)sender;
            window.Close();
        }
    }
}
下面是vertex.shader:

#version 150 core

in vec2 position;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
}
下面是fragment.shader:

#version 150 core
out vec4 outColor;
void main()
{
    outColor = vec4(1.0, 1.0, 1.0, 1.0);
}
编辑: 根据(谢谢)的建议,我在所有操作之前添加了Gl.Initialize() 其他的我还从预处理器指令中删除了
core
,现在着色器编译时出现以下错误:

WARNING: 2:1: invalid profile specified
ERROR: 2:1: '' : syntax error: #version
ERROR: 2:1: '' : syntax error: unexpected tokens following preprocessor 
directive - expected a newline

有什么帮助吗?

您的着色器以
#version 150 core
开始,它与OpenGL 3.2 core概要文件版本相匹配。
要正确使用它,您必须设置正确的上下文

我不知道SMFL。我可以猜到你的问题,你缺乏这种背景设置。你应该这样做:

    // Create the main window
    ContextSettings settings = new ContextSettings
    {
        DepthBits = 24,
        StencilBits = 8,
        AntialiasingLevel = 2, // optional
        MajorVersion = 3, // OpenGL version
        MinorVersion = 2, // OpenGL version
        AttributeFlags = ContextSettings.Attribute.Core
    };
    RenderWindow window = new RenderWindow(new VideoMode(800, 600), "SFML Works!", settings);
    window.setActive(true); //set the context as current
另一种方法是让SFML请求一个兼容性概要文件,它与核心概要文件相反。然后启动没有“核心”的着色器,如
#version 150

谢谢您的回答,但是
上下文设置
构造函数似乎不包含
属性标签
的选项。由于SFML 2.3.SMFL.Net尚不支持版本2.3。可能在一切都解决问题之前调用Gl.Initialize。这是另一个问题,但您应该确保表示源的字符串数组中的每一行都以\n字符结尾。