c++ - OpenGL绘制倒三角形

标签 c++ opengl

我的三角形顶点在数组顶点中,这些顶点的指定方式是我应该得到一个直立的三角形,但我的三角形是围绕 y 轴倒转的。 代码如下。

这是一些全局性的东西

#include<GL\glew.h>
#include<GL\freeglut.h>
#include<glm.hpp>
#include<gtc\matrix_transform.hpp>
#include<string>
#include<fstream>
#include<iostream>
using namespace std;

GLfloat vertices[] = {
    -1,-1,
    1,-1,
    0,1
};

GLuint vaoId;
GLuint vboId;

glm::mat4 projectionMatrix = glm::perspective(50.0f, 1.0f / 1.0f, 5.0f, 
20.0f);
glm::mat4 modelViewMatrix = glm::translate(glm::mat4(1), glm::vec3(0, 0, -20));

string parseShader(string fileName) {
    string shaderCode;
    ifstream ifs;
    ifs.open(fileName, ios::in);
    string line;
    while (!ifs.eof()) {
        getline(ifs, line);
        shaderCode += line;
        shaderCode += "\n";
    }
    return shaderCode;
}

GLuint program;

这个函数只是加载着色器

void loadShader() {
    string vShader = parseShader("vShader.txt");
    GLuint vShaderId = glCreateShader(GL_VERTEX_SHADER);
    const GLchar* vShaderSource = vShader.c_str();
    glShaderSource(vShaderId, 1, &vShaderSource, NULL);
    glCompileShader(vShaderId);
    GLint compileStatus;
    glGetShaderiv(vShaderId, GL_COMPILE_STATUS, &compileStatus);
    if (!compileStatus) {
        cout << "Cannot compile shader\n";
        glDeleteShader(vShaderId);
        return;
    }

    string fShader = parseShader("fShader.txt");
    GLuint fShaderId = glCreateShader(GL_FRAGMENT_SHADER);
    const GLchar* fShaderSource = fShader.c_str();
    glShaderSource(fShaderId, 1, &fShaderSource, NULL);
    glCompileShader(fShaderId);
    glGetShaderiv(fShaderId, GL_COMPILE_STATUS, &compileStatus);
    if (!compileStatus) {
        cout << "Cannot compile fragment Shader\n";
        glDeleteShader(fShaderId);
        return;
    }

    GLuint programId;
    programId = glCreateProgram();
    glAttachShader(programId, vShaderId);
    glAttachShader(programId, fShaderId);
    glLinkProgram(programId);
    GLint linkStatus;
    glGetProgramiv(programId, GL_LINK_STATUS, &linkStatus);
    if (!linkStatus) {
        cout << "Cannot link program\n";
        glDeleteShader(vShaderId);
        glDeleteShader(fShaderId);
        glDeleteProgram(programId);
        return;
    }
    glUseProgram(programId);
}

这会在 VBO 中加载数据

void loadDataInBuffers() {
    glGenBuffers(1, &vboId);
    glBindBuffer(GL_ARRAY_BUFFER, vboId);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

此函数用于将状态绑定(bind)到 VAO

void loadVao() {
    glBindBuffer(GL_ARRAY_BUFFER, vboId);
    glGenVertexArrays(1, &vaoId);
    glBindVertexArray(vaoId);
    glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

这是渲染函数

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vaoId);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glutSwapBuffers();
}

这会调用上面定义的所有其他函数

void init() {
    glClearColor(0, 0, 0, 0);
    loadDataInBuffers();
    loadShader();
    loadVao();
    glUniformMatrix4fv(1, 1, GL_FALSE, &projectionMatrix[0][0]);
    glUniformMatrix4fv(2, 1, GL_FALSE, &modelViewMatrix[0][0]);
}

我的主要方法是这样的

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Simple Window");
    glewInit();
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

下面是顶点Shader

#version 430

layout(location = 0) in vec2 pos;
layout(location = 1) uniform mat4 projectionMatrix;
layout(location = 2) uniform mat4 modelViewMatrix;

void main(){
    vec4 position = vec4(pos,0,1);
    gl_Position = projectionMatrix*modelViewMatrix*position;
}

下面是片段着色器

#version 430

void main(){
    gl_FragColor = vec4(1,0,0,1);
}

这是我得到的 THis is what I get when I draw the Triangle

我不应该得到这样的东西吗 Shouldn't I get something like this

最佳答案

编辑:

您似乎遇到了此处描述的问题:https://www.opengl.org/discussion_boards/showthread.php/185661-glm-perspective-inverts-image

glm::mat4 projectionMatrix = glm::perspective(50.0f, 1.0f / 1.0f, 5.0f, 20.0f);

您已经指定了角度 (50.0) 的度数;它应该以弧度为单位。 50 弧度是一个奇怪的数字,可能不是您想要的。

显然这个函数的单位没有很好的记录(我无法访问文档站点,所以我不知道)。将 50.0 替换为以弧度为单位的任何值,看看是否可行。

glm::mat4 projectionMatrix = glm::perspective(50.0f * M_PI / 180.0f, 1.0f / 1.0f, 5.0f, 20.0f);

关于c++ - OpenGL绘制倒三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45440365/

相关文章:

c++ - OpenGL3.3 中的代码不在正交投影中渲染纹理

c++ - OpenGL 和 GLM : How to send a matrices array to GLSL

c++ - 如何将 LONG 转换为 CString?

c++ - GNU make 忽略隐式规则

c++ - 什么是RMI的C版本

c++ - Printf 不打印输出

c++ - 为在 OpenGL 中使用基本物理和渲染寻找一个好的形状类设计

c++ - 使用 task_group(新用户)的 Intel Threading Building Blocks 性能不佳

c++ - 我是否需要在所有绘图代码之后重复 glOrtho 调用?

c++ - 转换为 Cinder gl::Texture