C++ OpenGL片段着色器没有效果,如何确定错误?
我正在运行MacOSXLion,我正在尝试编写一个基本的OpenGl程序,但我的片段着色器不起作用。当我不包括它,我得到我的黑色三角形,但当我做屏幕只是白色。我也没有错误加载它。调试这个的最佳方法是什么?以下是我的着色器: 顶点:C++ OpenGL片段着色器没有效果,如何确定错误?,c++,opengl,osx-lion,C++,Opengl,Osx Lion,我正在运行MacOSXLion,我正在尝试编写一个基本的OpenGl程序,但我的片段着色器不起作用。当我不包括它,我得到我的黑色三角形,但当我做屏幕只是白色。我也没有错误加载它。调试这个的最佳方法是什么?以下是我的着色器: 顶点: #version 120 attribute vec2 coord2d; void main(void) { gl_Position = vec4(coord2d, 0.0, 1.0); } 片段: #version 120 void main(void)
#version 120
attribute vec2 coord2d;
void main(void) {
gl_Position = vec4(coord2d, 0.0, 1.0);
}
片段:
#version 120
void main(void) {
gl_FragColor[0] = 1.0;
gl_FragColor[1] = 1.0;
gl_FragColor[2] = 0.0;
}
以及加载我从中获得的着色器的代码
编辑以添加更多信息
int init_resources()
{
GLfloat triangle_vertices[] = {
0.0f, 0.8f,
-0.8f, -0.8f,
0.8f, -0.8f,
};
glGenBuffers(1, &vbo_triangle);
glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW);
GLint link_ok = GL_FALSE;
GLuint vs, fs;
if ((vs = create_shader("vertShader.sh", GL_VERTEX_SHADER)) == 0) return 0;
if ((fs = create_shader("fragShader.sh", GL_FRAGMENT_SHADER)) == 0) return 0;
program = glCreateProgram();
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
if (!link_ok) {
fprintf(stderr, "glLinkProgram:");
print_log(program);
return 0;
}
const char* attribute_name = "coord2d";
attribute_coord2d = glGetAttribLocation(program, attribute_name);
if (attribute_coord2d == -1) {
fprintf(stderr, "Could not bind attribute %s\n", attribute_name);
return 0;
}
return 1;
}
void onDisplay()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
glEnableVertexAttribArray(attribute_coord2d);
glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
glVertexAttribPointer(
attribute_coord2d,
2,
GL_FLOAT,
GL_FALSE,
0,
0
);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(attribute_coord2d);
glutSwapBuffers();
}
GLuint create_shader(const char* filename, GLenum type)
{
const GLchar* source = file_read(filename);
if (source == NULL) {
fprintf(stderr, "Error opening %s: ", filename); perror("");
return 0;
}
GLuint res = glCreateShader(type);
glShaderSource(res, 1, source, NULL);
free((void*)source);
glCompileShader(res);
GLint compile_ok = GL_FALSE;
glGetShaderiv(res, GL_COMPILE_STATUS, &compile_ok);
if (compile_ok == GL_FALSE) {
fprintf(stderr, "%s:", filename);
print_log(res);
glDeleteShader(res);
return 0;
}
return res;
}
必须添加gl_FragColor[3]=1.0;因为我没有设置不透明度 与此同时,您似乎找到了解决方案,但我想给您另一个提示,这最近对我(对所有这些都很陌生)有很大帮助,特别是如果您正在使用Mac OS X: 我建议您安装“XCode图形工具”(可从开发者下载部分获得),这将对您开发着色器有很大帮助,特别是:
- OpenGL着色器生成器,可帮助您开发和测试着色器
- OpenGL Profiler,它不仅可以帮助您分析应用程序,还可以查看加载了哪些资源等。在您的情况下,您可以设置断点以停止执行(例如在交换之前),然后查看加载的着色器,并在运行时对其进行修改,以查看更改的效果
希望这对您有所帮助看起来您在正确的轨道上检查错误代码并检查着色器编译状态,尽管在没有看到代码的情况下很难指定其他要检查的内容。使用OGL可以进行一些调试,这需要一个小小的飞跃,您必须正确地使用大量样板文件才能显示第一个三角形。如果你想展示你所拥有的,我可能会发现一些东西,但是如果你想自己调试它,我会很感激。我很感激你的帮助,我添加了一个新的功能,我认为其他功能都是相关的。但是对于这样的问题,没有类似的调试器吗?通常你可以通过调用glGetError找到最坏的东西。还有gdebugger,这是一个不错的软件,但它更多的是用于检查缓冲区和纹理等内容。它不会明确告诉你为什么屏幕上没有三角形。嗯,glGetError返回0,gdebugger与lion不兼容。我会继续寻找bug,干杯。我觉得你的代码很完美,我看不出有任何问题。我可能会错过一些东西,但它看起来是正确的。顺便说一下,不要单独设置这些组件,只需使用
gl_FragColor=vec4(1.0,1.0,0.0,1.0)代码>。这是GLSL而不是C。它甚至可以防止您的问题,因为将vec3
分配给vec4
是一个错误,您必须显式添加第四个组件。太棒了,这就是我正在寻找的工具。