C OpenGL奇怪的颜色

C OpenGL奇怪的颜色,c,opengl,C,Opengl,我试图在OpenGL中绘制一个彩色正方形,但我只得到一些看起来很奇怪的彩色线条。当我在着色器中手动设置颜色时,它会起作用,但当我将其作为属性发送时,它不会起作用 这是我的最小、完整且可验证的示例 #include <stdio.h> #include <stdlib.h> #include <GL/glew.h> #include <GLFW/glfw3.h> void glfw_framebuffer_size_callback(GLFWwin

我试图在OpenGL中绘制一个彩色正方形,但我只得到一些看起来很奇怪的彩色线条。当我在着色器中手动设置颜色时,它会起作用,但当我将其作为属性发送时,它不会起作用

这是我的最小、完整且可验证的示例

#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

void glfw_framebuffer_size_callback(GLFWwindow *window, int width, int height)
{
    glViewport(0, 0, width, height);
}

int main()
{
    glfwInit();
    GLFWwindow *window = glfwCreateWindow(640, 480, "test", NULL, NULL);

    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, glfw_framebuffer_size_callback);
    glfwSwapInterval(0);

    glewExperimental = GL_TRUE;
    glewInit();

    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    GLfloat verts[] = {-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f};
    GLfloat color[] = {
        255.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 255.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 255.0f, 1.0f,
        255.0f, 255.0f, 0.0f, 1.0f
    };

    GLuint verts_vbo;
    glGenBuffers(1, &verts_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, verts_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);

    GLuint color_vbo;
    glGenBuffers(1, &color_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, color_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW);

    const GLchar *v_shader_source =
        "#version 330 core\n"
        "in vec4 vcoords;"
        "in vec4 color;"
        "out vec4 frag_color;"
        "uniform mat4 model, view, projection;"
        "void main() { gl_Position = vcoords;"
        "frag_color = color; }";

    const GLchar *f_shader_source =
        "#version 330 core\n"
        "in vec4 frag_color;"
        "out vec4 final_color;"
        "void main() { final_color = frag_color; }";

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vs, 1, &v_shader_source, NULL);
    glShaderSource(fs, 1, &f_shader_source, NULL);

    glCompileShader(vs);
    glCompileShader(fs);

    GLuint shader = glCreateProgram();
    glAttachShader(shader, vs);
    glAttachShader(shader, fs);
    glLinkProgram(shader);
    glDeleteShader(vs);
    glDeleteShader(fs);

    glUseProgram(shader);

    GLuint verts_index = glGetAttribLocation(shader, "vcoords");
    glEnableVertexAttribArray(verts_index);
    glBindBuffer(GL_ARRAY_BUFFER, verts_vbo);
    glVertexAttribPointer(verts_index, 2, GL_FLOAT, GL_FALSE, 0, NULL);

    GLuint color_index = glGetAttribLocation(shader, "color");
    glEnableVertexAttribArray(color_index);
    glBindBuffer(GL_ARRAY_BUFFER, color_vbo);
    glVertexAttribPointer(color_index, 4, GL_FLOAT, GL_FALSE, 0, NULL);

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        glfwSwapBuffers(window);
        glfwWaitEvents();
    }

    glDeleteProgram(shader);

    return 0;
}
#包括
#包括
#包括
#包括
无效glfw_帧缓冲区_大小_回调(GLFWwindow*窗口,整数宽度,整数高度)
{
glViewport(0,0,宽度,高度);
}
int main()
{
glfwInit();
GLFWwindow*window=glfwCreateWindow(640480,“测试”,空,空);
glfwMakeContextCurrent(窗口);
glfwSetFramebufferSizeCallback(窗口,glfw_framebuffer_size_回调);
glfwSwapInterval(0);
glewExperimental=GL_TRUE;
glewInit();
GLuint-vao;
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
GLfloat顶点[]={-1.0f,1.0f,-1.0f,-1.0f,1.0f,1.0f,1.0f,1.0f,-1.0f};
GLfloat颜色[]={
255.0f,0.0f,0.0f,1.0f,
0.0f、255.0f、0.0f、1.0f、,
0.0f、0.0f、255.0f、1.0f、,
255.0f、255.0f、0.0f、1.0f
};
GLuint verts_vbo;
glGenBuffers(1,&verts_vbo);
glBindBuffer(GL_数组_BUFFER,verts_vbo);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态绘制);
胶合色;
glGenBuffers(1,&color_vbo);
glBindBuffer(GL_数组_BUFFER,color_vbo);
glBufferData(GLU数组缓冲区、大小(颜色)、颜色、GLU静态图);
常量GLchar*v_着色器_源=
“#版本330核心\n”
“在vec4 vcoords中;”
“使用vec4颜色;”
“out vec4 frag_颜色;”
统一mat4模型、视图、投影
“void main(){gl_Position=vcoords;”
“frag_color=color;}”;
常量GLchar*f_着色器_源=
“#版本330核心\n”
“在vec4 frag_颜色中;”
“输出vec4最终颜色;”
“void main(){final_color=frag_color;}”;
GLuint vs=glCreateShader(GL_顶点_着色器);
GLuint fs=glCreateShader(GL_片段_着色器);
glShaderSource(vs,1,&v_shader_source,NULL);
glShaderSource(fs,1,&f_shader_source,NULL);
glCompileShader(vs);
glCompileShader(fs);
GLuint shader=glCreateProgram();
glAttachShader(着色器,vs);
glAttachShader(着色器,fs);
glLinkProgram(着色器);
glDeleteShader(vs);
glDeleteShader(fs);
glUseProgram(着色器);
GLuint verts_index=glGetAttribLocation(着色器,“vcoords”);
GlenableVertexAttributeArray(verts_指数);
glBindBuffer(GL_数组_BUFFER,verts_vbo);
glvertexattributepointer(顶点索引,2,GL\u浮点,GL\u假,0,空);
GLuint color_index=glGetAttribLocation(着色器,“颜色”);
GlenableVertexAttributeArray(颜色指数);
glBindBuffer(GL_数组_BUFFER,color_vbo);
glvertexattributepointer(颜色索引,4,GL浮动,GL假,0,空);
而(!glfwWindowShouldClose(窗口))
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
gldrawArray(GL_三角带,0,4);
glfwSwapBuffers(窗口);
glfwaitevents();
}
gldelete程序(着色器);
返回0;
}
这就是结果:

我做错了什么


代码仍然太长,无法在不添加更多文本的情况下提交,但我不知道还能说些什么。

为什么颜色数组中没有4个顶点的颜色?你在做一些你没有展示给我们的实例和属性分割吗?在a中编辑。实际上你刚刚解决了我的问题,我不知道每个顶点都必须有颜色。尽管如此,我还是想知道为什么我可以在片段着色器中使用单个vec4为整个四边形着色,但在将其作为属性发送时,我必须指定每个顶点。现在编辑我的问题。您的颜色数组中似乎有255.0和1.0的奇怪混合。是的,当您对颜色通道使用浮点值时,可见颜色在0-1范围内。它仅适用于要使用0-255的8位值。