2016-03-25 6 views
0

私はいくつかの基本的なOpenGLのもので遊んでいますが、照明が有効な単純な正方形を設定しようとしていますが、照明が正しくないので、推測。明るさと法線でのOpenGLの最初のステップ

または法線の理解が完全に間違っていますか?ここで

enter image description here

は私のレンダリングコード(ところで、私はLWJGLを使用しています)です: パブリッククラスレンダラ{

DisplayMode displayMode; 
int i; 
int width; 
int height; 
private boolean drawAxes = false; 
private float rotation = 40.0f; 
private float zoom = -20f; 

// ----------- Variables added for Lighting Test -----------// 
private FloatBuffer matSpecular; 
private FloatBuffer lightPosition; 
private FloatBuffer whiteLight; 
private FloatBuffer lModelAmbient; 

public Renderer(int width, int height) { 
    this.width = width; 
    this.height = height; 
} 

public static Renderer start() throws LWJGLException { 
    Renderer r = new Renderer(800, 600); 
    r.initContext(); 
    r.run(); 
    return r; 
} 

private void initContext() throws LWJGLException { 
    Display.setFullscreen(false); 
    DisplayMode d[] = Display.getAvailableDisplayModes(); 
    for (int i = 0; i < d.length; i++) { 
     if (d[i].getWidth() == width && d[i].getHeight() == height && d[i].getBitsPerPixel() == 32) { 
      displayMode = d[i]; 
      break; 
     } 
    } 
    Display.setDisplayMode(displayMode); 
    Display.create(); 
} 

private void run() { 
    initGL(); 
    while (!Display.isCloseRequested()) { 
     preRender(); 
     render(); 
     Display.update(); 
     Display.sync(60); 
    } 
    Display.destroy(); 
} 

private void initGL() { 

    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background 
    GL11.glClearDepth(1.0); // Depth Buffer Setup 
    GL11.glEnable(GL11.GL_DEPTH_TEST); // Enables Depth Testing 
    GL11.glDepthFunc(GL11.GL_LEQUAL); // The Type Of Depth Testing To Do 

    GL11.glMatrixMode(GL11.GL_PROJECTION); // Select The Projection Matrix 
    GL11.glLoadIdentity(); // Reset The Projection Matrix 

    // Calculate The Aspect Ratio Of The Window 
    GLU.gluPerspective(45.0f, (float) displayMode.getWidth()/(float) displayMode.getHeight(), 0.1f, 100.0f); 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The Modelview Matrix 

    // Really Nice Perspective Calculations 
    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); 

    GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); 

    initLightArrays(); 
    glShadeModel(GL_SMOOTH); 
    glMaterial(GL_FRONT, GL_SPECULAR, matSpecular); // sets specular material color 
    glMaterialf(GL_FRONT, GL_SHININESS, 100.0f); // sets shininess 

    glLight(GL_LIGHT0, GL_POSITION, lightPosition); // sets light position 
    glLight(GL_LIGHT0, GL_SPECULAR, whiteLight); // sets specular light to white 
    glLight(GL_LIGHT0, GL_DIFFUSE, whiteLight); // sets diffuse light to white 
    glLightModel(GL_LIGHT_MODEL_AMBIENT, lModelAmbient); // global ambient light 

    glEnable(GL_LIGHTING); // enables lighting 
    glEnable(GL_LIGHT0); // enables light0 

    glEnable(GL_COLOR_MATERIAL); // enables opengl to use glColor3f to define material color 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // tell opengl glColor3f effects the ambient and diffuse properties of material 

} 

private void preRender() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    GL11.glTranslatef(0f, 0f, zoom); 
    GL11.glRotatef(-60f, 1f, 0f, 0f); 
    GL11.glRotatef(rotation, 0f, 0f, 1f); 
} 

private void render() { 

    FloatBuffer cBuffer = BufferUtils.createFloatBuffer(6*3); 
    float[] cArray = { 1f,1f,1f, 
         1f,1f,1f, 
         1f,1f,1f, 
         1f,1f,1f, 
         1f,1f,1f, 
         1f,1f,1f}; 
    cBuffer.put(cArray); 
    cBuffer.flip(); 

    FloatBuffer vBuffer = BufferUtils.createFloatBuffer(6*3); 
    float[] vArray = { 1f,1f,0f, 
         -1f,-1f,0, 
         1f,-1f,0, 
         1f,1f,0f, 
         -1f,1f,0, 
         -1f,-1f,0}; 
    vBuffer.put(vArray); 
    vBuffer.flip(); 

    FloatBuffer nBuffer = BufferUtils.createFloatBuffer(6*3); 
    float[] nArray = { 0f,0f,1f, 
         0f,0f,1f, 
         0f,0f,1f, 
         0f,0f,1f, 
         0f,0f,1f, 
         0f,0f,1f}; 
    nBuffer.put(nArray); 
    nBuffer.flip(); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glColorPointer(3, 0, cBuffer); 
    glVertexPointer(3, 0, vBuffer); 
    glNormalPointer(3, nBuffer); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 

    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 

    if (drawAxes) { 
     drawAxes(6); 
    } 

    glTranslatef(0.0f, 0.0f, 3); 
    glColor3f(0.1f, 0.4f, 0.9f); 
} 

public static void main(String[] args) throws LWJGLException { 
    System.setProperty("org.lwjgl.opengl.Display.allowSoftwareOpenGL", "true"); 
    Renderer.start(); 
} 
+0

[このチュートリアル](https://bitbucket.org/alfonse/gltut/wiki/Home)に従ってください。本当に優れた説明はすべて、私はジョグル[ここ](https:// github .com/elect86/modern-jogl-examples)、それをlwjglに簡単に翻訳する必要があります – elect

+0

返信いただきありがとうございます。しかし、たとえそれが推奨されていなくても、正しく動作しないはずですか? – dagon

+0

あなたが示したものよりもはるかに多くのコードがあります。間違っている可能性があります – elect

答えて

1

あなたは、通常のポインタ間違って設定されています

glColorPointer(3, 0, cBuffer); 
glVertexPointer(3, 0, vBuffer); 
glNormalPointer(3, nBuffer); 

は固定機能GLは常に法線は3次元のベクトルであることを期待可能性がある、でありますどのように多くの値GLを伝えるsizeパラメータ(ヘンツェすべてベクトル)はglNormalPointerには存在しません。ここで設定する3は、連続する配列要素間のバイトオフセットを指定するstrideパラメータです。今3は何の意味もなく、2番目の法線を最初の3バイトをarryに解釈します。つまり、最初の法線のx成分の最後のバイトと、最初の法線のy成分の3バイトが結合されます。 2番目の法線のコンポーネントなど...

配列がしっかりとパックされているので、他のポインタと同様にショートカット0をここで使用できます。

しかし、あなたはそのすべてがは、OpenGLのほぼ十年以来を廃止されました、OpenGLのの近代的なコアバージョンはすべてに固定機能パイプラインをサポートしていないことに注意しなければなりません。最近OpenGLを学んでいる人なら、現代のシェーダベースのGLを習得することを強くお勧めします。

+0

それだけです!どうもありがとうございました!いくつかの基本的な(!)最新のOpenGLチュートリアルをお勧めしますか?私はJavaを好むだろうが、C++も大丈夫だろう。編集:typo – dagon

+0

@dagon:私は[Learning Modern 3D Graphics Programming](http://alfonse.bitbucket.org/oldtut/index.html)と[open.gl](https://open.gl/)は次のように考えています。結構いい。私は特にJavaについては何も知らない。 – derhass

0

はあなたのコードの多くを見ることなく、それは間違って起こっている正確に何を参照することは非常に困難です。

しかし、私が問題になる可能性がある一つのことを参照ください:あなたの三角形に

FloatBuffer vBuffer = BufferUtils.createFloatBuffer(6*3); 
float[] vArray = { 1f,1f,0f, 
        1f,-1f,0, 
        -1f,-1f,0, 
        1f,1f,0f, 
        -1f,1f,0, 
        -1f,-1f,0}; 
vBuffer.put(vArray); 
vBuffer.flip(); 

巻き順序は同じではありません。第1の三角形は時計回りに巻かれ、第2の三角形は反時計回りに巻かれます。頂点の順序を変えて、同じ方向に巻くようにする必要があります。 OpenGLは通常、反時計回りに風を当てることを好みます。もし私があなただったら、最初の三角形を反転します。

これを実行しても問題が解決しない場合は、ここに表示されている内容が多くの情報を提供しないため、描画コードの残りの部分を投稿してください。

+0

あなたの返信ありがとう!残念ながら、三角形を反転させても問題は解決しませんでした。私は全体のコードを追加するためにorinigal投稿を編集したので、あなたはそれを見ることができます。 – dagon

関連する問題