所以最近我开始看一个粗俗的诅咒,但是当我了解到着色器时,我在制作着色器或定义它们时遇到了麻烦:
#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上获得了这些错误行)是
错误:: SHADER :: VERTEX :: COMPILATION_FAILED 0(6):错误C0000:语法错误,意外的'}',期望为','或';'在令牌“}”处
错误:: 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"
是这个符号; XD
并在线
23
错误的是"}\n"
右边的"{\n"
这只是错过点击
抱歉打扰了
答案 0 :(得分:0)
您的顶点着色器缺少分号,并且片段着色器使用错误的括号打开了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 ++中一样。如果将着色器代码转储到控制台,它们可能使调试更加容易,但是它们不会影响代码的行为或性能。