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]?
私asumptionは私がする座標を倍増場合ので、何とか間違ってスケーリングされ座標系ということです(( - 2 | 0 | 0)、(0 | 2 | 0)、(2 | 0 | 0)最初の場所でpected:
は、なぜこの出来事であると私は(第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);
}
}
コードはgithubで入手できます:https://github.com/SimonLammer/Android-GlEs20CameraOverlay – EvilDevil
私はこの問題に関係のないすべてのコードを削除した新しいブランチを開始しました:https://github.com/SimonLammer/Android-GlEs20CameraOverlay/tree/without-camera-preview – EvilDevil