使用着色器渲染“顶点彩色”三角形时的OpenGL“黑屏”

有毒

我是OpenGL的新手,并且一直在关注这个非常简单的教程,在该教程中,我应该创建一个顶点着色的三角形(该教程)。

虽然,我的结果只是显示为黑屏。我尝试完全复制他的代码,但仍然无法正常工作,这使我感到教程已经过时了。

我试过删除着色器中的“ #version 130”,但没有执行任何操作。我还调试了render函数,它确实被调用了。我不知道有什么问题。

这是我的代码:

main.cpp

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <GL\glew.h>
#include <GL\freeglut.h>
#include <stdio.h>

#define BUFFER_OFFSET(i) ((char *)NULL + (i))
GLuint shaderProgramID;
GLuint vao = 0;
GLuint vbo;
GLuint positionID, colorID;

#pragma region SHADER_FUNCTIONS
static char* readFile(const char* filename) {
    //Open the file
    FILE* fp = fopen(filename, "r");
    //Move to the end of file
    fseek(fp, 0, SEEK_END);
    long file_length = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char* contents = new char[file_length + 1];
    //zero out memory
    for (int i = 0; i < file_length + 1; i++) {
        contents[i] = 0;
    }
    //Read file
    fread(contents, 1, file_length, fp);
    //Denote end
    contents[file_length + 1] = '\0';
    fclose(fp);
    return contents;
}

GLuint makeVertexShader(const char* shaderSource) {
    GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShaderID, 1, (const GLchar**)&shaderSource, NULL);
    glCompileShader(vertexShaderID);
    return vertexShaderID;
}

GLuint makeFragmentShader(const char* shaderSource) {
    GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShaderID, 1, (const GLchar**)&shaderSource, NULL);
    glCompileShader(fragmentShaderID);
    return fragmentShaderID;
}

GLuint makeShaderProgram(GLuint vertexShaderID, GLuint fragmentShaderID) {
    GLuint shaderID = glCreateProgram();
    glAttachShader(shaderID, vertexShaderID);
    glAttachShader(shaderID, fragmentShaderID);
    glLinkProgram(shaderID);
    return shaderID;
}
#pragma endregion

void changeViewport(int w, int h) {
    glViewport(0, 0, w, h);
}

void render() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glutSwapBuffers();
    printf("Debug");
}

int main(int argc, char** argv) {
    //Init GLUT
    glutInit(&argc, argv);

    //Set up some memory buffers for our display
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    //Set up window size
    glutInitWindowSize(800, 600);
    //Create window
    glutCreateWindow("Project 1");
    //Bind the two functions to respond when necessary
    glutReshapeFunc(changeViewport);
    glutDisplayFunc(render);

    //Initialize OpenGL driver
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW error");
        return 1;
    }

    //Vertices and colors of trangle
    GLfloat vertices[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f,-0.5f, 0.0f
    };
    GLfloat colors[] = {
        1.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f
    };

    #pragma region MAKE_SHADER
    char* vertexShaderSourceCode = readFile("vertexShader.vs");
    char* fragmentShaderSourceCode = readFile("fragmentShader.fs");
    GLuint vertShaderID = makeVertexShader(vertexShaderSourceCode);
    GLuint fragShaderID = makeFragmentShader(fragmentShaderSourceCode);
    GLuint shaderProgramID = makeShaderProgram(vertShaderID, fragShaderID);

    printf("vertShaderID is %d\n", vertShaderID);
    printf("fragmentShaderID is %d\n", fragShaderID);
    printf("shaderProgramID is %d\n", shaderProgramID);
    #pragma endregion

    //Create the "remember-all"
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    //Create buffer
    glBufferData(GL_ARRAY_BUFFER, 7 * 3 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
    //Load the vertex points
    glBufferSubData(GL_ARRAY_BUFFER, 0, 3 * 3 * sizeof(GLfloat), vertices);
    //Load the colors
    glBufferSubData(GL_ARRAY_BUFFER, 3 * 3 * sizeof(GLfloat), 3 * 4 * sizeof(GLfloat), colors);

    //Find variables in shader
    positionID = glGetAttribLocation(shaderProgramID, "s_vPosition");
    colorID = glGetAttribLocation(shaderProgramID, "s_vColor");

    glVertexAttribPointer(positionID, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glVertexAttribPointer(colorID, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(3 * 3 * sizeof(GLfloat)));
    glUseProgram(shaderProgramID);
    glEnableVertexAttribArray(positionID);
    glEnableVertexAttribArray(colorID);

    //Start up a loop that runs in the background
    glutMainLoop();
    return 0;
}

fragmentShader.fs

#version 130

in vec4 color;
out vec4 fColor;

void main () {
    fColor = color;
}

顶点着色器

#version 130

in vec4 s_vPosition;
in vec4 s_vColor;
out vec4 color;

void main () {
    //gl_Position = s_mP*s_mV*s_mM*s_vPosition;
    color = s_vColor;
    gl_Position = s_vPosition;
}
有毒

嗯,很抱歉创建这个。睡觉并再次查看代码后,我意识到我所有的顶点都具有相同的“ y值”。

GLfloat vertices[] = {
   -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.0f, -0.5f, 0.0f
};

无论如何,它已经解决了。天哪,我感到愚蠢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在vertexShader中使用OpenGl未声明的标识符,我在顶点着色器中绘制三角形时遇到问题

来自分类Dev

如何在片段着色器中推导三角形顶点

来自分类Dev

使用GLSL着色器后第一个三角形不渲染

来自分类Dev

webgl在不使用变换矩阵的情况下在顶点着色器中旋转三角形

来自分类Dev

OpenGL:创建彩色三角形

来自分类Dev

缩放单独的三角形(在几何着色器中?)

来自分类Dev

OpenGL不渲染三角形

来自分类Dev

OpenGL GLFW,三角形不渲染

来自分类Dev

OpenGL三角形未渲染

来自分类Dev

用OpenGL渲染意外的三角形

来自分类Dev

使用 OpenGL 绘制基本三角形

来自分类Dev

通过顶点颜色为三角形着色的算法

来自分类Dev

PyOpenGL奇怪的随机彩色三角形

来自分类Dev

如何在OpenGl中计算三角形网格的顶点法线?

来自分类Dev

OpenGL三角形旋转并修改了顶点

来自分类Dev

OpenGL:指定三角形的意外顶点位置

来自分类Dev

为什么在使用着色器时出现黑屏?

来自分类Dev

三角形法线与顶点法线

来自分类Dev

从顶点获取网格的三角形

来自分类Dev

为三角形法线和扇形提供法线以进行OpenGL Gouraud着色

来自分类Dev

matplotlib:使用fill_between制作彩色三角形

来自分类Dev

无法在OpenGL C ++中渲染三角形

来自分类Dev

无法在OpenGL C ++中渲染三角形

来自分类Dev

三角形无法正确渲染

来自分类Dev

如何使用三角形顶点坐标(每个三角形有 9 个数字)在 matplotlib 中绘制 3d 三角形?

来自分类Dev

使用着色器时纹理无法渲染?

来自分类Dev

在javafx上的三角形网格中为单个三角形着色

来自分类Dev

如何使用vbo为每个三角形着色不同

来自分类Dev

OpenGL三角形邻接索引

Related 相关文章

热门标签

归档