2014-03-05 62 views
0

我试图绘制画面合成和ortographic预测与“Matrix.setLookAtM”投影在一个简单的三角形,但它不是渲染它。在Android上的OpenGL ES 2.0 - Ortographic和setLookAt矩阵一起

我试过很多的组合与思考什么可能是错误的,但并没有解决问题。我认为矩阵乘法语法也很好(如果我将“a_Vision”设置为单位矩阵,那么也会呈现三角形)。

我想他们我错过任何概念的想法。

另外,我要乘 “a_Vision” X “a_OrtographicProjection” 或 “a_OrtographicProjection” X “a_Vision”?

代码如下。

package com.opengl01_themostbasic; 

import static android.opengl.GLES20.GL_FLOAT; 
import static android.opengl.GLES20.GL_TRIANGLES; 
import static android.opengl.GLES20.glDrawArrays; 
import static android.opengl.GLES20.glUniform4f; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.opengl.GLES20; 
import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.Matrix; 


public class RendererClass implements Renderer { 

int shaderProgram; 

int variableToSayWhereTheVertexShaderShouldFindInformation; 
int variableToSayWhereTheFragmentShaderShouldFindInformation; 
int variableToSayWhereTheMatrixShouldFindInformation; 

int BYTES_PER_FLOAT = 4; 
FloatBuffer vertexData; 

float[] a_OrtographicProjection = new float[16]; 
float[] a_Vision = new float[16]; 
float[] a_sTemp = new float[16]; 
float[] a_Result = new float[16]; 

public RendererClass(Context context){ 

    float[] myVertices = { 

      // X, Y, Z 

      -8f, 8f, -2f, 
      0f, -4f, -2f, 
      5f, 3f, -2f 

    }; 

    ByteBuffer intermediateBuffer = ByteBuffer.allocateDirect(myVertices.length*BYTES_PER_FLOAT); 
    intermediateBuffer.order(ByteOrder.nativeOrder()); 

    vertexData = intermediateBuffer.asFloatBuffer(); 
    vertexData.put(myVertices); 

} 

@Override 
public void onSurfaceCreated(GL10 arg0, EGLConfig config) { 

    GLES20.glClearColor(0.4f, 0.5f, 0.8f, 1.0f); 


    String vertexShaderCode = "attribute vec4 myVertexPositionInsideOpenGL;" 
           + "uniform mat4 a_Result;" 

           + "void main(){" 
           +  "gl_Position = a_Result*myVertexPositionInsideOpenGL;" 
           + "}"; 


    String fragmentShaderCode = "precision mediump float;" 
           + "uniform vec4 myColorsInsideOpenGL;" 

           + "void main(){" 
           +  "gl_FragColor = myColorsInsideOpenGL;" 
           + "}"; 

    int vertexShaderID = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); 
    int fragmentShaderID = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); 

    GLES20.glShaderSource(vertexShaderID, vertexShaderCode); 
    GLES20.glShaderSource(fragmentShaderID, fragmentShaderCode); 

    GLES20.glCompileShader(vertexShaderID); 
    GLES20.glCompileShader(fragmentShaderID); 

    shaderProgram = GLES20.glCreateProgram(); 

    GLES20.glAttachShader(shaderProgram, vertexShaderID); 
    GLES20.glAttachShader(shaderProgram, fragmentShaderID); 

    GLES20.glLinkProgram(shaderProgram);  
    GLES20.glUseProgram(shaderProgram); 

    variableToSayWhereTheVertexShaderShouldFindInformation = GLES20.glGetAttribLocation(shaderProgram, "myVertexPositionInsideOpenGL"); 
    variableToSayWhereTheFragmentShaderShouldFindInformation = GLES20.glGetUniformLocation(shaderProgram, "myColorsInsideOpenGL"); 
    variableToSayWhereTheMatrixShouldFindInformation = GLES20.glGetUniformLocation(shaderProgram, "a_Result"); 

    GLES20.glEnableVertexAttribArray(variableToSayWhereTheVertexShaderShouldFindInformation); 

    vertexData.position(0); 
    GLES20.glVertexAttribPointer(variableToSayWhereTheVertexShaderShouldFindInformation, 3, GL_FLOAT, false, 0, vertexData); 

} 

@Override 
public void onSurfaceChanged(GL10 arg0, int width, int height) { 

    Matrix.orthoM(a_OrtographicProjection, 0, -20, 20, -20, 20, 2, -4); 
    Matrix.setLookAtM(a_Vision, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0); 

    Matrix.multiplyMM(a_sTemp, 0, a_Vision, 0, a_OrtographicProjection, 0); 
    System.arraycopy(a_sTemp, 0, a_Result, 0, a_sTemp.length); 

} 

@Override 
public void onDrawFrame(GL10 glUnused) { 

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);  

    GLES20.glUniformMatrix4fv(variableToSayWhereTheMatrixShouldFindInformation, 1, false, a_Result, 0); 

    glUniform4f(variableToSayWhereTheFragmentShaderShouldFindInformation, 1.0f, 0.0f, 1.0f, 1.0f); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

} 

} 

回答

0

姑且,尝试:

Matrix.setLookAtM(a_Vision, 0, 0, 0, 3.0f, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

documentation

[...]的眼点,视中心,和一个向上矢量

和你只是定义眼点(0,0,3),视(0,0,0)为中心,但没有了载体。

+0

这些变化制定出适合你?没有任何区别。 –

+0

这是“暂定”:) – miguelao