OpenGL着色器不绘制[关闭]

Posted

技术标签:

【中文标题】OpenGL着色器不绘制[关闭]【英文标题】:OpenGL Shaders Dont Draw [closed] 【发布时间】:2018-09-06 20:12:24 【问题描述】:

所以最近我开始看 udemy 诅咒,但是当我谈到着色器时,我遇到了一个问题,来自于制作着色器或定义它们时的行:

#include iostream

#define GLEW_STATIC
#include GL/glew.h

#include GLFW/glfw3.h

const GLint WIDTH = 800, HEIGHT = 600;

//here start the shaders def/creation
const GLchar *vertexShaderSource = 
"#version 330 core\n"
"layout ( location = 0 ) in vec3 position;\n"
"void main( )\n"
"\n"
"gl_Position = vec4( position.x, position.y, position.z, 1.0 )\n"
"";

const GLchar *fragmentShaderSource = 
"#version 330 core\n"
"out vec4 color;\n"
"void main( )\n"
"\n"
"color = vec4( 1.0f, 0.5f, 0.2f, 1.0f );\n"
"";
//here it ends

//more code down here
//....
//....

然后我在控制台中得到的(其他代码在 cmd 上得到那些错误行)是:

ERROR::SHADER::VERTEX::COMPILATION_FAILED 0(6) : 错误 C0000: 语法错误,意外的 '',期待 ',' 或 ';'在令牌“”

ERROR::SHADER::FRAGMENT::COMPILATION_FAILED 0(4) : 错误 C0000: 语法错误,意外的 '',期待 ',' 或 ';'在令牌“”

ERROR::SHADER::PROGRAM::LINKING_FAILED

顶点信息

0(6) : 错误 C0000: 语法错误,意外 '',期待 ',' 或 ';'在令牌“” (0) : 错误 C2003: 链接选项不兼容

片段信息

0(4) : 错误 C0000: 语法错误,意外 '',期待 ',' 或 ';'在令牌“” (0) : 错误 C2003: 链接选项不兼容

我知道支持着色器不是问题,因为我实际上可以运行 3.0 着色器,但可以在我定义着色器的代码中吗?

编辑: 好吧,对不起,如果我用这个问题打扰了某人,但原因是 在第 16 行 错误是这样的: "gl_Position = vec4( position.x, position.y, position.z, 1.0 )\n"

和权利 "gl_Position = vec4( position.x, position.y, position.z, 1.0 );\n"

是的,这个符号;呵呵

并且在行 23 错误的是"\n" 和右边"\n" 这只是错过点击 不好意思打扰了

【问题讨论】:

你能提供一个minimal reproducible example吗? gl_Position = vec4( position.x, position.y, position.z, 1.0 ) 后缺少分号 (;) ....-_- 如果可行的话 好了一半已经完成了,可能是另一个分号什么的 你必须在片段中使用一个开放的弧形括号void main( ) 插入一个封闭的 之后的着色器 【参考方案1】:

您的顶点着色器缺少分号,并且您的片段着色器使用错误的大括号打开main 函数。

const GLchar *vertexShaderSource = 
"#version 330 core\n"
"layout ( location = 0 ) in vec3 position;\n"
"void main( )\n"
"\n"
//=============================================Mistake is here↓
"gl_Position = vec4( position.x, position.y, position.z, 1.0 )\n"
//===============================================================
"";

const GLchar *fragmentShaderSource = 
"#version 330 core\n"
"out vec4 color;\n"
"void main( )\n"
//↓Mistake======================================
"\n"
//==============================================
"color = vec4( 1.0f, 0.5f, 0.2f, 1.0f );\n"
"";

修复这两个错误,您的代码应该可以工作了。

此外,您需要的唯一显式换行符是#version 指令之后的第一个换行符。它们将在编译阶段被删除,就像在 C 或 C++ 中一样。如果您将着色器代码转储到控制台,它们可能会使调试更容易,但它们不会影响代码的行为或性能。

【讨论】:

@Rabbid76 我在看到所有 cmets 之前就开始写答案了。无论哪种方式,您都不应该因为这个确切原因回答 cmets 中的问题。 我推荐使用Raw string literals。这个问题是题外话,因为它是一个简单的印刷错误。 感谢您抽出宝贵的时间来回答,我终于在您说之前完成了工作,但仍然感谢您

以上是关于OpenGL着色器不绘制[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

简单的 OpenTK 着色器不起作用

OpenGL片段着色器不照亮场景

用于在大满贯中绘制特征点的opengl着色器[关闭]

如何使用OpenGL着色器在平面上绘制没有透视的纹理?

OpenGL几何着色器三角形不会没有错误地绘制

为啥这个在opengl中绘制三角形的着色器不会多次运行