OpenGL着色器错误
OpenGL shader error
我正在使用wxwidgets库编写一个OpenGL程序,我主要工作,但是由于插入了不良字符,我会遇到阴凉器编译错误(我认为),只有我才能't找出角色在哪里或导致它们的原因。错误是:
error 0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
我不确定为什么,因为当我cout弦时我看不到任何错误。这是被喂给GlshaderSource()的东西:
#version 430 core
layout(location =0) in vec3 vpos;
out vec3 fragmentColor;
uniform mat4 MVP;
void main(void)
{
gl_Position = MVP * vec4(vpos,1);
};
这是我使用的着色器编译器函数:
void GL_set::compileAndLink()
{
GLint Result = GL_FALSE;
int InfoLogLength = 0;
// Create vertex shader, attach source code, compile
vertexShader = glCreateShader(GL_VERTEX_SHADER);
const GLchar* adapter[1];
adapter[0] = readShaderCode("Vshader.glsl").c_str();
glShaderSource(vertexShader, 1, adapter, NULL);
glCompileShader(vertexShader);
// Check vertex shader for errors
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &Result);
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0)
{
char vertexError[1000];
glGetShaderInfoLog(vertexShader, InfoLogLength, NULL, &vertexError[0]);
std::cout << &vertexError[0];
}
// Create fragment shader, attach source code, compile
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
adapter[0] = readShaderCode("Fshader.glsl").c_str();
glShaderSource(fragmentShader, 1, adapter, NULL);
glCompileShader(fragmentShader);
// Check fragment shader for errors
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &Result);
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0)
{
char fragmentError[1000];
glGetShaderInfoLog(fragmentShader, InfoLogLength, NULL,
&fragmentError[0]);
std::cout << &fragmentError[0];
}
// Create program and attach shaders
program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
//check program for errors
glGetProgramiv(program, GL_LINK_STATUS, &Result);
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &InfoLogLength);
if (InfoLogLength > 0)
{
char programError[1000];
glGetProgramInfoLog(program, InfoLogLength, NULL, &programError[0]);
std::cout << &programError[0];
}
}
std::string GL_set::readShaderCode(const char* fileName)
{
printf("passing %s to readShaderCode() n", fileName);
std::ifstream input(fileName);
if(!input.good())
{
std::cout << "failed to load file " << fileName;
exit(1);
}
std::string code = std::string(
std::istreambuf_iterator<char>(input),
std::istreambuf_iterator<char>()
);
// output the code to cout for error checking
std::cout << "Read shader input: n" << code << "n" << std::endl;
return code;
}
这是完整的控制台输出:
normal display attribs are supported
calling gl_init()
gl_set construtor called
setting buffers
passing Vshader.glsl to readShaderCode()
Read shader input:
#version 430 core
layout(location =0) in vec3 vpos;
out vec3 fragmentColor;
uniform mat4 MVP;
void main(void)
{
//output position of the vertex in clip space MVP*position
gl_Position = MVP * vec4(vpos,1);
};
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
passing Fshader.glsl to readShaderCode()
Read shader input:
#version 430 core
in vec3 fragmentColor;
out vec3 color;
void main()
{
color = fragmentColor;
};
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
Vertex info
-----------
0(1) : error C0000: syntax error, unexpected $undefined at token "
<undefined>"
(0) : error C2003: incompatible options for link
Fragment info
-------------
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
(0) : error C2003: incompatible options for link
Loading OBJ file mod.obj...
这是班级的其余部分:
#include "GL_set.h"
GL_set::GL_set()
{
std::cout << "gl_set construtor called" << std::endl;
GL_set::setBuffers();
}
void GL_set::setBuffers()
{
std::cout << "setting buffers" << std::endl;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
//create shaders and attach them to the program object
GL_set::compileAndLink();
loadOBJ("mod.obj", vdata); // use OBJ loader
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, vdata.size()*sizeof(glm::vec3), &vdata[0], GL_STATIC_DRAW);
//vertex buffer
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0, //index
3, //size
GL_FLOAT, //type
GL_FALSE, //normalized?
0, //stride
0 //array buffer offset
);
}
void GL_set::draw()
{
glBindVertexArray(vao);
GLuint matrixID = glGetUniformLocation(program, "MVP");
////////////////////////////matrix operations/////////////////////////////////////////
//projection matrix 45 degree FoV, 4:3 ratio, display range 0.1 - 100
glm::mat4 projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f);
//camera matrix
glm::mat4 view = glm::lookAt(
glm::vec3(8, 8, 8), //camera posiiton
glm::vec3(0, 1, 0), //camera looks at this point
glm::vec3(0, 1, 0) //head up position
);
//model matrix identity matrix
glm::mat4 model = glm::mat4(1.0f);
//rotate
model = glm::rotate(model, 1.0f, glm::vec3(1,1,1));
//model-view-projection
glm::mat4 MVP = projection * view * model;
/////////////////////////////////////////////////////////
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &MVP[0][0]);
glDrawArrays(GL_TRIANGLES, 0, vdata.size()*sizeof(glm::vec3));
}
我认为我拥有的wxwidgets相关代码还可以,窗口接口带有空白的白屏幕,大概是由着色器错误引起的。我可以在需要时发布更多,谢谢。
readShaderCode
返回的std::string
仅在.c_str()
调用期间生存。之后,允许std::string
实现来释放内存,将您的adapter[0]
点留给刚刚释放的内存(无用时)。
您应该将readShaderCode
的结果分配给本地std::string
变量,以便仅在函数末尾释放内存。然后,您可以将.c_str()
的结果安全地存储到adapter
中,知道内存尚未释放。
相关文章:
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 现代OpenGL和GLEW Libraray的编译错误
- GLFW DDS 加载函数的 OpenGL 链路错误
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- C++ OpenGL 中,绘制形状返回错误
- OpenGL C++(制作简单窗口时抛出错误)
- CMake on FindOpenGL.cmake 中的错误,当使用导入的目标 OpenGL::GLU?
- C++/OpenGL 随机分段错误
- 当我在网格/面中实现索引时,为什么它会返回OpenGl错误
- 在 CLion (MacOS) 中使用 OpenGL 和 GLUT 库时出现链接错误
- OpenGL, GLFW, GLAD. glViewport(0, 0, 800, 600) 抛出内存错误
- OpenGL "Segmentation fault"错误
- 在运行时处理 OpenGL 错误
- OpenGL 顶点缓冲区类重定义和模板方法错误
- 假设传递给 OpenGL 的结构数组的内存布局存在潜在错误
- 如何找到 NVIDIA OpenGL 驱动程序的错误 ID 名称?
- C++生成文件错误 (openGl)
- cocos2dx错误:opengl版本太旧
- SDL错误.OpenGL激活,使用SDL_GL_SwapBuffers()