OpenGL着色器不绘制

时间:2018-09-06 20:12:24

标签: c++ opengl shader glfw glew

所以最近我开始看一个粗俗的诅咒,但是当我了解到着色器时,我在制作着色器或定义它们时遇到了麻烦:

#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" 这只是错过点击 抱歉打扰了

1 个答案:

答案 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 ++中一样。如果将着色器代码转储到控制台,它们可能使调试更加容易,但是它们不会影响代码的行为或性能。