C OpenGL glfw3三角形不显示

C OpenGL glfw3三角形不显示,c,opengl,graphics,glfw,C,Opengl,Graphics,Glfw,我有一个简单的OpenGL C应用程序,它试图在屏幕上画一个三角形。我已经成功地编写了类似C++的代码,没有问题。当我运行C程序时,它会创建一个窗口,但不会显示任何内容。下面是我代码的主要部分 void init() { GLfloat vertices[] = { // Positions 0.0f, 0.5f, 0.0f, 0.0f, // Top 0.5f, -0.5f, 0.0f, 0.0f, // Bottom Right

我有一个简单的OpenGL C应用程序,它试图在屏幕上画一个三角形。我已经成功地编写了类似C++的代码,没有问题。当我运行C程序时,它会创建一个窗口,但不会显示任何内容。下面是我代码的主要部分

void init()
{   
GLfloat vertices[] = {
    // Positions         
    0.0f,  0.5f, 0.0f, 0.0f,    // Top
    0.5f, -0.5f, 0.0f, 0.0f,    // Bottom Right
    -0.5f, -0.5f, 0.0f, 0.0f    // Bottom Left 
};

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

    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    //glBindBuffer(GL_ARRAY_BUFFER, 0);

    GLuint program = loadShader("/shader1.vert", 
        "/shader1.frag");
    glUseProgram(program);

    GLuint vPosition = glGetAttribLocation(program, "VPosition");
    glEnableVertexAttribArray(vPosition);
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
    glBindVertexArray (vao);
}

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    int w = 800;
    int h = 600;

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    //glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "glfw3", NULL, NULL);
    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    glViewport(0, 0, WIDTH, HEIGHT);

    init();

    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays( GL_TRIANGLES, 0, 3 );
        glfwSwapBuffers(window);
    }

    glfwTerminate();
    return 0;
}
使用顶点着色器

attribute vec4 vPosition;
void main()
{
    gl_Position = vPosition;
}
和片段着色器

void main()
{
    gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
}
以及加载着色器

char *readShader(char *filename)
{
FILE *fp;
char *content = NULL;

int count = 0;
if(filename != NULL)
{
    fp = fopen(filename, "rt");
    if(fp != NULL){
        fseek(fp, 0, SEEK_END);
        count = ftell(fp);
        rewind(fp);
        if (count > 0) {
            content = (char *)malloc(sizeof(char) * (count+1));
            count = fread(content,sizeof(char),count,fp);
            content[count] = '\0';
        }
    }
    fclose(fp);
}
return content; 
}

GLuint loadShader(char *vertex_path, char *fragement_path)
{   
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);

char *vertShaderStr = readShader(vertex_path);
char *fragShaderStr = readShader(fragement_path);

printf("Compiling vertex shader\n");
GLint vertLength = strlen(vertShaderStr);
glShaderSource(vertShader, 1, (const char **)&vertShaderStr, &vertLength);
glCompileShader(vertShader);

//Check vertex shader
GLint vertSuccess;
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &vertSuccess);
if(vertSuccess == GL_FALSE) {
    char log[1024];
    glGetShaderInfoLog(vertShader, sizeof(log), 0, log);
    printf("Vertex shader compile info: \n %s \n", log);
    glDeleteShader(vertShader);
    return 1;
}


printf("Compiling fragment shader\n");
GLint fragLength = strlen(fragShaderStr);
glShaderSource(fragShader, 1, (const char **)&fragShaderStr, &fragLength);
glCompileShader(fragShader);

//Check fragment shader
GLint fragSuccess;
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &fragSuccess);
if(vertSuccess == GL_FALSE) {
    char log[1024];
    glGetShaderInfoLog(vertShader, sizeof(log), 0, log);
    printf("Fragment shader compile info: \n %s \n", log);
    glDeleteShader(fragShader);
    return 1;
}

printf("Linking program\n");
GLuint program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);

GLint programSuccess;
glGetProgramiv(program, GL_LINK_STATUS, &programSuccess);
if(programSuccess == GL_FALSE) {
    char log[1024];
    glGetProgramInfoLog(program, sizeof(log), 0, log);
    printf("shader link info: \n %s \n", log);
    glDeleteProgram(program);
    return 1;
}

//printf("%s", vertShaderStr);
//printf("%s", fragShaderStr);
return program;
}
在这里: GLfloat顶点[]={ //职位
0.0f,0.5f,0.0f,0.0f,//顶部 0.5f,-0.5f,0.0f,0.0f,//右下角 -0.5f,-0.5f,0.0f,0.0f//左下角 }

将0指定为所有顶点的w坐标。你真的想把1放在这里,否则你的顶点会无限远

请注意,通常所有顶点的输入w`坐标始终为1,将其显式存储在数组中会浪费内存和带宽。如果未指定,GL将自动将向量的第四个分量扩展为1,因此您只需使用

GLfloat vertices[] = {
    // Positions         
    0.0f,  0.5f, 0.0f,    // Top
    0.5f, -0.5f, 0.0f,    // Bottom Right
    -0.5f, -0.5f, 0.0f,   // Bottom Left 
};
// ...
glVertexAttribPointer(vPosition, 3 GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
根本不更改着色器中的
属性vec4


我还怀疑的是,您从未加载GL函数指针。我还没有粘贴您包含的标题,但该标题肯定不会在所有平台上都起作用。

我本人是OpenGL的初学者,但从我所看到的情况来看,您从未解开您的标题。以下是您的
#版本
指令<代码>loadShader()实现?所有3个顶点都在一条线上。因此,无论你做什么渲染(我没有看代码的其余部分),你都不会覆盖任何像素。修复三角形顶点(我以前尝试过几个不同的顶点)不幸的是仍然是一样的。谢谢你的回复。这是我的代码中的一个问题,它现在正在工作。