Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL片段着色器没有效果,如何确定错误?_C++_Opengl_Osx Lion - Fatal编程技术网

C++ 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)

我正在运行MacOSXLion,我正在尝试编写一个基本的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;
}
以及加载我从中获得的着色器的代码

编辑以添加更多信息

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,它不仅可以帮助您分析应用程序,还可以查看加载了哪些资源等。在您的情况下,您可以设置断点以停止执行(例如在交换之前),然后查看加载的着色器,并在运行时对其进行修改,以查看更改的效果

以下是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
是一个错误,您必须显式添加第四个组件。太棒了,这就是我正在寻找的工具。