我的三角形顶点在数组顶点中,这些顶点的指定方式是我应该得到一个直立的三角形,但我的三角形是围绕 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);
}
最佳答案
编辑:
您似乎遇到了此处描述的问题: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/