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着色器不绘制[关闭]的主要内容,如果未能解决你的问题,请参考以下文章