【问题标题】:OpenGL fragment shader has no effect, how to determine the error?OpenGL片段着色器没有效果,如何判断错误?
【发布时间】:2012-05-30 02:11:21
【问题描述】:

我正在运行 Mac OS X Lion,并且正在尝试编写一个基本的 OpenGl 程序,但我的片段着色器无法正常工作。当我不包括它时,我得到了黑色三角形,但是当我这样做时,屏幕只是白色的。加载它也没有错误。调试此问题的最佳方法是什么?这是我的着色器:

顶点:

#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;
}

以及加载我从this tutorial 获得的着色器的代码。

已编辑以添加更多信息

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;
}

【问题讨论】:

  • 似乎您在检查错误代码和检查着色器编译状态方面处于正确的轨道上,但除了没有看到代码之外,很难规定其他要检查的内容。使用 OGL 可以实际进行一些调试需要一点飞跃,您必须获得大量样板文件才能让您的第一个三角形出现。如果你想展示你所拥有的东西,我可能会发现一些东西,但如果你想自己调试,我会很感激。
  • 感谢您的帮助,我添加了一个我认为相关的唯一其他功能。但是像这样的问题没有调试器吗?
  • 通常你可以通过调用 glGetError 找到最糟糕的事情。还有 gdebugger 是一个不错的软件,但它更多地用于检查缓冲区和纹理等的内容。它不会明确告诉您为什么屏幕上没有三角形。
  • hm,glGetError 返回 0 并且 gdebugger 与 lion 不兼容。我会继续寻找错误,干杯。
  • 您的代码对我来说看起来很完美,我看不出有任何问题。我可能会错过一些东西,但它看起来是正确的。

标签: c++ opengl osx-lion


【解决方案1】:

必须添加 gl_FragColor[3] = 1.0;因为我没有设置不透明度。

【讨论】:

  • 顺便说一下,不要单独设置这些单独的组件,只需使用gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);。这是 GLSL 而不是 C。它甚至可以阻止您的问题,因为将 vec3 分配给 vec4 是错误的,您必须显式添加第四个组件。
【解决方案2】:

与此同时,您似乎找到了解决方案,但我想再给您一个提示,它最近对我很有帮助(对这一切也很陌生),尤其是在您使用 Mac OS X 时:

我建议您安装“XCode 图形工具”(可从开发者下载部分获得),这将极大地帮助您开发着色器,尤其是:

  • OpenGL Shader Builder,可帮助您开发和测试着色器

  • OpenGL Profiler 不仅可以帮助您分析应用程序,还可以查看加载了哪些资源等,在您的情况下:您可以设置断点以停止执行(例如在交换之前),然后查看加载的着色器,并在运行时对其进行修改,以查看更改有什么影响

这是 OpenGL Profiler 的用户指南: https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGLProfilerUserGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40006475-CH1-DontLinkElementID_31

希望有帮助

【讨论】:

  • 太棒了,这些正是我正在寻找的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多