C#-OpenGl.Net着色器无法编译且没有错误
我正在使用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
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字符结尾。