2017-01-02 146 views
1

我的片段着色器不工作,它只绘制白色。 我认为着色器在一起是不行的。我尝试多次改变颜色并且没有运气。Opengl片段着色器只绘制白色

#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的挂钩。

+2

编译着色器时可以检查错误。例如,您正在将vec3的位置分配给gl_Position,即vec4 – FamZ

+1

也可能在GL调用中出现错误,您可以使用glGetError()或一些glew错误来检测这些错误。这些很可能在你的情况,因为它似乎像你的屏幕甚至没有清除 – FamZ

+0

谢谢,问题是设置gl_Position到position.Just一个错误。谢谢! –

回答

1

问题就出在你的顶点着色器,你不能直接分配给position因为gl_Positionposition一个vec3gl_Positionvec4。 你可以这样做:

gl_Position = vec4(position, 1.0f); 

,或者你可以定义positionvec4即使你的位置vec3position的最后一个组件将在这种情况下,自动设置为1.0f

layout (location=0) in vec4 position; 

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

0
gl_Position = position; 

需要。

gl_Position = vec4(position,1.0); 

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

相关问题