2012-04-17 124 views
0

我一直在使用帶有一些輸入的着色器繪製簡單的頂點指定(盒狀)茶壺模型時出現翻譯和旋轉問題。我一遍又一遍地檢查了我的gl代碼和矩陣(在-z上的對象位置,相機在原點等),並沒有明白爲什麼我仍然只是空白屏幕。爲了保持代碼簡潔,我只是在我的模型的基本立方體的代碼(一旦我至少得到,我會好起來的)。在opengl中未繪製的頂點

namespace TeapotViewer{ 

class TeapotViewer{ 

private: 
    void intitialize(); 
    void draw(); 
    void reshape(int h, int w); 
    void keyHandle(unsigned char key, int x, int y); 
    void initCamera(); 
    void reset(); 
    void changeAxis(); 
    void rotateOnAxis(float rot); 
    int createCube(int i); 

public: 

}; 

}

#include "TeapotViewer.h" 

using namespace glm; 

const int S_WIDTH = 800; 
const int S_HEIGHT = 600; 
const float FOV = 100; 
const float P_NEAR = 0.2; 
const float P_FAR = 20.0; 
const float SPOUT_WIDTH = 0.025; 
const float HANDLE_WIDTH = 0.15; 
const float ZERO = 0.0; 
const int numberOfVertices = 104; 
const int noCubeSide = 10; 
const int noCubeFace = 4; 
const int noLine = 2; 

mat4 modelxViewMatrix, projMatrix, viewMatrix, rotationMatrix, translationMatrix; 
vec3 rotationAxis; 
vec3 teapotPosition = vec3(0.0, 0.0,-3.0); 

const vec3 cameraPosition = vec3(0.0, 0.0, 0.0); 
const vec3 cameraDirection = vec3(0.0, 0.0, -1.0); 
const vec3 cameraUp = vec3(0.0, 1.0, 0.0); 

vec4 vertices[numberOfVertices]; 
GLuint refVertexArray; 
GLuint refVertexBuffer; 
GLuint refUniformModelxView; 
GLuint refUniformProjection; 

const vec4 body[] = { 

    vec4(-1.0,-1.0, 1.0, 1.0), vec4(-1.0, 1.0, 1.0, 1.0), 
    vec4(1.0,-1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0), 
    vec4(1.0,-1.0,-1.0, 1.0), vec4(1.0, 1.0,-1.0, 1.0), 
    vec4(-1.0,-1.0,-1.0, 1.0), vec4(-1.0, 1.0,-1.0, 1.0) 
}; 

const vec3 xAxis = vec3(1.0, 0.0, 0.0); 

const vec3 yAxis = vec3(0.0, 1.0, 0.0); 

const vec3 zAxis = vec3(0.0, 0.0, 1.0); 

// draw callback 
void draw(){ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    translationMatrix = translate(mat4(), teapotPosition); 

    modelxViewMatrix = viewMatrix*translationMatrix*rotationMatrix; 

    glUniformMatrix4fv(refUniformModelxView, 1, &modelxViewMatrix[0][0]); 
    glUniformMatrix4fv(refUniformProjection, 1, &projMatrix[0][0]); 
    void drawTeapot(); 

    glutSwapBuffers(); 
} 

void drawTeapot(){ 

    int bufferIndex = 0; 
    // draw cube 
    glDrawArrays(GL_TRIANGLE_STRIP, bufferIndex, noCubeSide); 
    bufferIndex += noCubeSide; 
    glDrawArrays(GL_TRIANGLE_STRIP, bufferIndex, noCubeFace); 
    bufferIndex += noCubeFace; 
    glDrawArrays(GL_TRIANGLE_STRIP, bufferIndex, noCubeFace); 
    bufferIndex += noCubeFace; 


    // draw the axis of rotation 
    if (rotationAxis == xAxis){ 

     glDrawArrays(GL_LINES, bufferIndex, noLine); 
     bufferIndex += noLine; 
    } 
    if (rotationAxis == yAxis){ 

     bufferIndex += noLine; 
     glDrawArrays(GL_LINES, bufferIndex, noLine); 
     bufferIndex += noLine; 
    } 
    if (rotationAxis == zAxis){ 

     bufferIndex += noLine*2; 
     glDrawArrays(GL_LINES, bufferIndex, noLine); 
     bufferIndex += noLine; 

    } 
} 

// reset back to the start 
void reset(){ 

    teapotPosition = vec3(0.0, 0.0,-3.0); 

    rotationMatrix = mat4(); 

} 

void changeAxis(){ 

    if(rotationAxis == xAxis) 
     rotationAxis = yAxis; 
    else 
    if(rotationAxis == yAxis) 
     rotationAxis = zAxis; 
    else 
     rotationAxis = xAxis; 
} 

void rotateOnAxis(float rot){ 

    rotationMatrix = rotate(rotationMatrix, rot, rotationAxis); 
} 




// handle keypress 
void keyHandle(unsigned char key, int x, int y){ 

    switch(key){ 

     case 033: 
      exit(EXIT_SUCCESS); 
      break; 
     case '0': 
      reset(); 
      break; 
     case 'a': 
      teapotPosition = teapotPosition + vec3(-0.1, 0.0, 0.0); 
      break; 
     case 'd': 
      teapotPosition = teapotPosition + vec3(0.1, 0.0, 0.0); 
      break; 
     case 'w': 
      teapotPosition = teapotPosition + vec3(0.0, 0.1, 0.0); 
      break; 
     case 's': 
      teapotPosition = teapotPosition + vec3(0.0, -0.1, 0.0); 
      break; 
     case 'q': 
      teapotPosition = teapotPosition + vec3(0.0, 0.0, -0.1); 
      break; 
     case 'e': 
      teapotPosition = teapotPosition + vec3(0.0, 0.0, 0.1); 
      break; 
     case 'j': 
      changeAxis(); 
      break; 
     case 'k': 
      rotateOnAxis(-5.0); 
      break; 
     case 'l': 
      rotateOnAxis(5.0); 
      break; 
    } 

    glutPostRedisplay(); 
} 


void reshape(int h, int w){ 

    glViewport(0, 0, h, w); 

} 

void initCamera(){ 

    viewMatrix = lookAt(cameraDirection, cameraPosition, cameraUp); 
    projMatrix = perspective(FOV, (float)S_WIDTH/(float)S_HEIGHT, P_NEAR, P_FAR); 
    reset(); 
} 




int createCube(int i){ 

    // sides of the cube 
    vertices[i++] = body[0]; 
    vertices[i++] = body[1]; 
    vertices[i++] = body[2]; 
    vertices[i++] = body[3]; 
    vertices[i++] = body[4]; 
    vertices[i++] = body[5]; 
    vertices[i++] = body[6]; 
    vertices[i++] = body[7]; 
    vertices[i++] = body[0]; 
    vertices[i++] = body[1]; 

    // top 
    vertices[i++] = body[0]; 
    vertices[i++] = body[2]; 
    vertices[i++] = body[4]; 
    vertices[i++] = body[6]; 

    //bottom 
    vertices[i++] = body[1]; 
    vertices[i++] = body[3]; 
    vertices[i++] = body[5]; 
    vertices[i++] = body[7]; 

    std::cout << i << '\n'; 

    return i; 

} 

int createAxes(int i){ 

    // X axis 
    vertices[i++] = vec4(2.0, 0.0, 0.0, 1.0); 
    vertices[i++] = vec4(-2.0, 0.0, 0.0, 1.0); 

    // Y axis 
    vertices[i++] = vec4(0.0, 2.0, 0.0, 1.0); 
    vertices[i++] = vec4(0.0,-2.0, 0.0, 1.0); 

    // Z axis 
    vertices[i++] = vec4(0.0, 0.0, 2.0, 1.0); 
    vertices[i++] = vec4(0.0, 0.0,-2.0, 1.0); 

    std::cout << i << '\n'; 

    return i; 
} 

// Initialize 
void initialize(){ 

    // generate vertex data 
    int i = 0; 
    i = createCube(i); 
    i = createAxes(i); 

    if(i != numberOfVertices){ 

     std::cout << "Error creating vertex data: check vertex count\n"; 
     std::exit(0); 
    } 

    // set 
    initCamera(); 

    // load shader and activate shader 
    GLuint refVertexShader = Angel::InitShader("Vertex_Shader.glsl", "Fragment_Shader.glsl"); 
    glUseProgram(refVertexShader); 

    // create and activate a new vertex array object (vao) 
    glGenVertexArrays(1, &refVertexArray); 
    glBindVertexArray(refVertexArray); 

    // create and activate a new buffer array object in the vao 
    glGenBuffers(1, &refVertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, refVertexBuffer); 

    // load vertex data into the buffer array 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    // load postion pipeline variable 
    GLuint refVec4Position = glGetAttribLocation(refVertexShader, "Position"); 
    glEnableVertexAttribArray(refVec4Position); 
    glVertexAttribPointer(refVec4Position, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    // get pointers for uniform variables in shader program 
    refUniformModelxView = glGetUniformLocation(refVertexShader, "ModelxView"); 
    refUniformProjection = glGetUniformLocation(refVertexShader, "Projection"); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    glClearColor(0.0, 0.0, 0.0, 1.0); 
} 

int main(int argc, char* argv[]){ 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(S_WIDTH, S_HEIGHT); 
    glutCreateWindow("TeapotViewer"); 

    glewInit(); 

    initialize(); 

    glutDisplayFunc(draw); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc(keyHandle); 

    glutMainLoop(); 
    return 0; 
} 

頂點着色器

#version 150 
uniform mat4 ModelxView; 
uniform mat4 Projection; 
in vec4 Position; 


void main() 
{ 
    gl_Position = Projection*ModelxView*Position; 
} 

片段着色器

 #version 150 
out vec4 fColor; 

void main() 
{ 
    fColor = vec4(1.0, 1.0, 0.0, 1.0); 
} 
+0

您是否嘗試過使用固定功能流水線來渲染它? – 2012-04-17 11:55:55

+0

@AndreasBrinck:這會如何幫助他讓着色器鱈魚工作? – 2012-04-17 16:03:31

+0

你可以先在渲染循環中確認glGetError == 0嗎? – Tim 2012-04-17 16:25:41

回答

0

不知道這一點,因爲我不知道發生了什麼事的天使: :在幕後,但輸出是否正確從你的片段着色器?我認爲在glsl 150中,它期望特殊變量gl_FragColor,除非天使做了特定的事情來緩解這一點。

我看了一會兒,但我沒有看到任何會導致問題的東西。不幸的是我認爲,如果你真的陷入困境,你可能不得不開始寫一個更簡單的例子(沒有函數,只是通過渲染三角形來初始化的直接過程)。

還要確保glGetError至少每draw()循環調用一次,以確保它不會丟失任何東西。天使在鏈接/編譯失敗時會拋出異常嗎?

+0

所有在天使命名空間是一個函數來加載頂點和片段着色器程序,我從我的教科書的資源引用下載並將InitShader.cpp調整爲.hpp,因爲如果沒有其他我不想使用的源文件,原始頭文件將無法編譯。

我真的很希望你對gl_FragColor有所瞭解,這會讓你很有意思,現在就試試看。

我跑我的程序打印glGetError()每幀,它每次返回0。 – Darksai 2012-04-17 21:13:19

+0

沒有傷心地工作。我查看了glsl 1.5規範,gl_fragColor已被棄用,Web上1.5的其他示例以同樣的方式用用戶定義的變量輸出顏色。 – Darksai 2012-04-17 21:38:47

+0

@Darksai我的錯誤,對不起 – Tim 2012-04-17 21:40:08

0

嗯,這個怎麼樣:

viewMatrix = lookAt(cameraDirection, cameraPosition, cameraUp);

這是相同的lookAt如gluLookAt?在這個功能中,原型是(position, lookAtPoint, cameraUp),這是你所得到的結果。