2017-02-27 11 views
1

this video(1:11:05)に座標系が-1から1の範囲で表示されていると聞いたので、私は混乱しています。 (0 | 1 | 0)、(0 | 1 | 0)、(1 | 0 | 0)の座標を使用すると、-2から2の範囲にあるように見えます。my project (https://github.com/SimonLammer/Android-GlEs20CameraOverlay/tree/without-camera-preview/app/src/main/java/simonlammer/htlleonding/ac/at/openglcameraoverlay) 、私は、私はそれがあることが予想ほど大きな半分である三角形を取得:なぜ私のOpenGL座標系軸が[-1; 1]?

triangle: ((-1|-1|0), (0|1|0), (1|0|0))

私asumptionは私がする座標を倍増場合ので、何とか間違ってスケーリングされ座標系ということです(( - 2 | 0 | 0)、(0 | 2 | 0)、(2 | 0 | 0)最初の場所でpected:

triangle: ((-2|-2|0), (0|2|0), (2|0|0))

は、なぜこの出来事であると私は(第2絵のように)フルスクリーン上で拡大縮小の三角形を得るように、座標の最初のセットを使用したとき、私は、それをどのように修正することができます((1 | 0 | 0)、(0 | 1 | 0)、(1 | 0 |

コード:

活動XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="simonlammer.htlleonding.ac.at.openglcameraoverlay.MainActivity"> 

     <simonlammer.htlleonding.ac.at.openglcameraoverlay.GlOverlay 
      android:id="@+id/overlay" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

</RelativeLayout> 

MainActivity:

public class MainActivity extends AppCompatActivity { 
    private GlOverlay glOverlay; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     glOverlay = (GlOverlay) findViewById(R.id.overlay); 
    } 

    @Override 
    protected void onPause() { 
     glOverlay.onPause(); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     glOverlay.onResume(); 
    } 
} 

GlOverlay:

public class GlOverlay extends GLSurfaceView { 
    private GlEs20Renderer renderer; 

    public GlOverlay(Context context) { 
     super(context); 
     init(); 
    } 

    public GlOverlay(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    private void init() { 
     this.renderer = new GlEs20Renderer(); 
     this.setEGLContextClientVersion(2); 
     this.setRenderer(renderer); 
     this.setRenderMode(RENDERMODE_CONTINUOUSLY); 
    } 
} 

GlEs20レンダラー:

public class GlEs20Renderer implements GLSurfaceView.Renderer { 
    private static final int COORDS_PER_VERTEX = 4; 
    private final float[] triangleCoords = { 
      -1.0f, -1.0f, 0.0f, 1.0f, 
      0.0f, 1.0f, 0.0f, 1.0f, 
      1.0f, 0.0f, 0.0f, 1.0f 
    }; 
    private final int vertexCount = triangleCoords.length/COORDS_PER_VERTEX; 
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per float 
    private FloatBuffer vertexBuffer; 

    private boolean setup = false; 
    private int program = -1; 

    private void setup() { 
     vertexBuffer = ByteBuffer.allocateDirect(triangleCoords.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     vertexBuffer.put(triangleCoords); 
     vertexBuffer.position(0); 

     String vertexShaderSource = 
       "attribute vec4 vPosition;" + 
       "uniform vec4 vTranslate;" + 
       "void main() {" + 
       " gl_Position = vPosition + vTranslate;" + 
       "}"; 

     String fragmentShaderSource = 
       "precision mediump float;" + 
       "uniform vec4 vColor;" + 
       "void main() {" + 
       " gl_FragColor = vColor;" + 
       "}"; 


     int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, 
       vertexShaderSource); 
     int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, 
       fragmentShaderSource); 

     // create empty OpenGL ES Program 
     program = GLES20.glCreateProgram(); 

     // add the vertex shader to program 
     GLES20.glAttachShader(program, vertexShader); 

     // add the fragment shader to program 
     GLES20.glAttachShader(program, fragmentShader); 

     // creates OpenGL ES program executables 
     GLES20.glLinkProgram(program); 
    } 

    private static int loadShader(int type, String shaderCode){ 

     // create a vertex shader type (GLES20.GL_VERTEX_SHADER) 
     // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER) 
     int shader = GLES20.glCreateShader(type); 

     // add the source code to the shader and compile it 
     GLES20.glShaderSource(shader, shaderCode); 
     GLES20.glCompileShader(shader); 

     return shader; 
    } 

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

    } 

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

    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 
     if (!setup) { 
      setup(); 
      setup = true; 
     } 

     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

     // Add program to OpenGL ES environment 
     GLES20.glUseProgram(program); 

     // get handle to vertex shader's vPosition member 
     int mPositionHandle = GLES20.glGetAttribLocation(program, "vPosition"); 

     // Enable a handle to the triangle vertices 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 

     // Prepare the triangle coordinate data 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, 
       GLES20.GL_FLOAT, false, 
       vertexStride, vertexBuffer); 

     // get handle to fragment shader's vColor member 
     int mColorHandle = GLES20.glGetUniformLocation(program, "vColor"); 

     // Set color for drawing the triangle 
     GLES20.glUniform4fv(mColorHandle, 1, new float[] {0.5f, 0.0f, 0.0f, 1.0f}, 0); 

     // move 
     GLES20.glUniform4fv(GLES20.glGetUniformLocation(program, "vTranslate"), 1, new float[] {0f, 0f, 0f, 1f}, 0); 

     // Draw the triangle 
     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 

     // Disable vertex array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
    } 
} 
+0

コードはgithubで入手できます:https://github.com/SimonLammer/Android-GlEs20CameraOverlay – EvilDevil

+0

私はこの問題に関係のないすべてのコードを削除した新しいブランチを開始しました:https://github.com/SimonLammer/Android-GlEs20CameraOverlay/tree/without-camera-preview – EvilDevil

答えて

1

この問題は、変換ベクトルと同次座標がどのように機能するかに起因します。簡単に言えば、クリッピング後の位置はw要素で分けられます。ポジションがA = [x,y,z,1]になり、[0,0,0,1]の翻訳が追加された場合、結果は[x,y,z,2]となり、パースペクティブは[x/2,y/2,z/2,1]に分割されます。

問題を解決するには、変換ベクトルの4番目の成分を0に設定するか、3次元変換ベクトルを使用します。

関連する問題