2017-08-01 159 views
1

我的三角形頂點位於數組頂點中,這些頂點的指定方式是我應該得到一個直立的三角形,但是我的三角形圍繞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); 
} 

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

我不應該得到這樣的事情 Shouldn't I get something like this

+0

有很多方法可以做到這一點,這取決於你想要做什麼。你可能會混淆你的矩陣,你可能會混淆頂點數據,你可以在頂點着色器中硬編碼一個鏡像。沒有更多的上下文,這很難回答。 – Frank

+0

您可以發佈2個屏幕截圖:一個實際的結果和一個它應該看起來像(使用油漆)。這樣,我們有更多的想法。 –

+0

@HannesHauptmann我編輯了我的文章和附帶圖片。 –

回答

2

編輯:

它看起來像你運行到這裏所描述的問題: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弧度是一個奇怪的數字,可能不是你想要的。

顯然這個功能的單位沒有很好的記錄(我不能到達doc站點,所以我不知道)。用弧度代替50.0,看看是否有效。

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

這使得三角形消失。我的相機在原點向下看向負Z軸,我的近和遠裁剪面分別爲5和20。所以我將我的三角形在負z軸上向下移動,以便它位於近平面和遠平面之間。 –

+0

@JitendraTiwari看看我的更新答案是否有幫助。 –

+0

是以弧度表示的指定角度。謝謝!!! –

0

如果所有你關心的是反相的最後圖像,最簡單的方法是在座標位於剪輯空間後,在頂點着色器的末端應用鏡像操作:

gl_Position = (projectionMatrix*modelViewMatrix*position) * vec4(1, -1, 1, 1); 
+0

當然,這將使它正確,但我所說的是我應該沒有得到它沒有鏡像操作。 –