2012-04-17 14 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

固定機能パイプラインでレンダリングしましたか? –

+0

@AndreasBrinck:彼はシェイダー・タラを働かせるのにどのように役立つだろうか? –

+0

レンダリングループでglGetError == 0を最初に確認できますか? – Tim

答えて

0

わからない、私は天使で何が起こっているのかわからないよう: :舞台裏ではありますが、それは正しい出力ですフラグメントシェーダーの?私は、glsl 150では、Angelがこれを緩和するために何か特別なことをしない限り、特殊変数gl_FragColorを期待していました。

私はこれをしばらく見ていましたが、問題を引き起こす原因は何も表示されません。残念なことに、あなたが本当に立ち往生していれば、より単純な例を書かなければならないかもしれないと思います(関数なし、三角形のレンダリングによる初期化のまっすぐな概要)。

また、draw()ループごとに少なくとも1回glGetErrorが呼び出され、何も欠けていないことを確認してください。エンジェルはリンク/コンパイルエラーで例外をスローしますか?

+0

天使の名前空間にあるのは、教科書のリソース参照からダウンロードした頂点とフラグメントシェーダープログラムInitShader.cppを.hppに適合させました。使用したくない他のソースファイルなしで元のヘッダーがコンパイルされないからです。
私は本当にあなたがgl_FragColorについて正しいと思っています。それは多くの意味をなさないでしょう、今すぐ試してみてください。

私はプログラムの印刷glGetError()を毎フレーム実行し、毎回0を返しました。 – Darksai

+0

悲しいことにはうまくいきませんでした。私はglsl1.5仕様を見て、gl_fragColorは既に廃止されており、Web上の1.5の他の例も同じ方法でユーザー定義変数で色を出力します。 – Darksai

+0

@ダカイ私のミス、申し訳ありません – Tim

0

うーん、これはどう:

viewMatrix = lookAt(cameraDirection, cameraPosition, cameraUp);

これはgluLookAtと同じルックアットますか?この関数のプロトタイプは(position, lookAtPoint, cameraUp)です。これはあなたが持っているものの後方にあります。