我的三角形頂點位於數組頂點中,這些頂點的指定方式是我應該得到一個直立的三角形,但是我的三角形圍繞y軸倒置。 代碼如下。OpenGL drawing倒三角形
這是一些全球性的東西
#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);
}
此功能用於狀態結合到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;
}
下面是頂點着色器
#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);
}
有很多方法可以做到這一點,這取決於你想要做什麼。你可能會混淆你的矩陣,你可能會混淆頂點數據,你可以在頂點着色器中硬編碼一個鏡像。沒有更多的上下文,這很難回答。 – Frank
您可以發佈2個屏幕截圖:一個實際的結果和一個它應該看起來像(使用油漆)。這樣,我們有更多的想法。 –
@HannesHauptmann我編輯了我的文章和附帶圖片。 –