【问题标题】:Opengl fragment shader only drawing in whiteOpengl片段着色器仅以白色绘制
【发布时间】:2017-05-16 04:20:53
【问题描述】:

我的片段着色器不工作,它只绘制白色。 我认为着色器一起不起作用。我尝试多次更改 colorO 并且没有运气。

#include <glew.h>
#include <glfw3.h>

GLuint compileshaders() {
GLuint vshader, fshader, program;

static const GLchar * vshadersource[] = {
    "#version 450 core                \n"
    " layout (location=0) in vec3 position;\n"
    " layout (location=1) in vec3 color;\n"
    "void main()                  \n"
    "{                                \n"
    "gl_Position = position;          \n"
    "}                                \n"
};

static const GLchar * fshadersource[] = {
    "#version 450 core                \n"
    "out vec4 colorO;                  \n"
    "void main()                  \n"
    "{                                \n"
    " colorO = vec4(1.0,1.0,0.0,1.0);  \n"
    "}                                \n"
};

vshader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vshader, 1, vshadersource, NULL);
glCompileShader(vshader);

fshader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fshader, 1, fshadersource, NULL);
glCompileShader(fshader);

program = glCreateProgram();
glAttachShader(program, vshader);
glAttachShader(program, fshader);
glLinkProgram(program);

glDeleteShader(vshader);
glDeleteShader(fshader);

return program;
}

int main(void)
{
GLFWwindow* window;
GLuint program;
GLuint vertex_array_object;
GLuint buffers[2];

if (!glfwInit())
    return -1;

window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
    glfwTerminate();
    return -1;
}

glfwMakeContextCurrent(window);

glewInit();

static const GLfloat positions[] =      {0.25,-0.25,0.5,0.25,0.25,0.5,-0.25,-0.25,0.5};
static const GLfloat colors[] = {1.0,0.0,1.0,1.0};

program = compileshaders();
glUseProgram(program);
glCreateVertexArrays(1, &vertex_array_object);
glCreateBuffers(2, &buffers[0]);
glNamedBufferStorage(buffers[0], sizeof(positions), positions, 0);
glVertexArrayVertexBuffer(vertex_array_object, 0, buffers[0], 0, sizeof(GLfloat) * 3);
glVertexArrayAttribFormat(vertex_array_object, 0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(vertex_array_object, 0, 0);
glEnableVertexArrayAttrib(vertex_array_object, 0);
glNamedBufferStorage(buffers[1], sizeof(colors), colors, 0);
glVertexArrayVertexBuffer(vertex_array_object, 1, buffers[1], 0, sizeof(GLfloat) * 3);
glVertexArrayAttribFormat(vertex_array_object, 1, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(vertex_array_object, 1, 1);
glEnableVertexArrayAttrib(vertex_array_object, 1);
glBindVertexArray(vertex_array_object);


GLfloat clearcolor[4] = { 0.0,0.0,0.4,1.0 };
glPointSize(40);

while (!glfwWindowShouldClose(window))
{
    glClearBufferfv(GL_COLOR, 0, clearcolor);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glfwSwapBuffers(window);
    glfwPollEvents();
}

glDeleteVertexArrays(1,&vertex_array_object);
glDeleteProgram(program);

glfwTerminate();
return 0;
}

有人可以帮我吗?我仍在尝试掌握 opengl 的窍门。

【问题讨论】:

  • 您可以在编译着色器时检查错误。例如,您将 vec3 的位置分配给 vec4 的 gl_Position
  • 您的 GL 调用中也可能存在错误,您可以使用 glGetError() 或一些 glew 错误来检测这些错误。在你的情况下这些是可能的,因为你的屏幕似乎甚至没有被清除
  • 谢谢,问题是将 gl_Position 设置为位置。只是一个小错误。谢谢!

标签: c++ opengl colors shader


【解决方案1】:
gl_Position = position;

需要。

gl_Position = vec4(position,1.0);

因为 gl_Position 是 vec4 而 position 是 vec3。 感谢 FamZ 帮助我发现我的错误。

【讨论】:

    【解决方案2】:

    问题在于您的顶点着色器,您不能直接将position 分配给gl_Position,因为positionvec3gl_Positionvec4。 你可以这样做:

    gl_Position = vec4(position, 1.0f);
    

    或者您可以将position 定义为vec4,即使您的职位是vec3,在这种情况下position 的最后一个组件将自动设置为1.0f

    layout (location=0) in vec4 position;
    

    您可以在调用glCompileShader 后检测到编译错误,因为您需要使用GL_COMPILE_STATUS 作为第二个参数调用glGetShaderiv,第三个参数是指向应该存储结果的变量的指针。这给出了0(GL_FALSE - 有一些编译错误) 或1(GL_TRUE - 编译成功)。如果有错误,你可以通过调用glGetShaderInfoLog获取错误日志,你也需要用glGetShaderiv获取信息日志长度(GL_INFO_LOG_LENGTH作为第二个参数)。您可以对链接器错误执行相同的操作,但是您需要调用 glGetProgram* 变体而不是 glGetShader* 变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多