日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

android清空frame,android – GLSurfaceView onDrawFrame清除行为

發(fā)布時(shí)間:2024/10/5 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android清空frame,android – GLSurfaceView onDrawFrame清除行为 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我使用GLSurfaceView遇到了不同的行為.

AFAIK是程序的責(zé)任,清除每幀的緩沖區(qū)(顏色和深度).這意味著如果我不清除緩沖區(qū),我會(huì)得到最后一幀的內(nèi)容(或者之前用于雙緩沖的內(nèi)容).

似乎無(wú)論在某些設(shè)備上是什么,緩沖區(qū)都被清除了.我在Addison Wesley OpenglES2.0編程指南中對(duì)一些具有不同結(jié)果的測(cè)試設(shè)備進(jìn)行了“Hello Triangle”程序的以下修改:

> Acer Iconia A500(4.0.3):未清除(預(yù)期行為)

> Sony XPERIA Go(4.0.4):已清除

> Galaxy S3(4.1.1):清除

> LG Optimus 4x HD(4.0.3):未清除

>三星Galaxy Tab 20.1(4.0.4):未清除

>摩托羅拉Xoom(3.2):未清除

> Galaxy S2(4.1.2 – rooted):清除

有沒(méi)有辦法強(qiáng)制在每個(gè)繪制回調(diào)中獲得一個(gè)未更改的緩沖區(qū)?

清除屏幕的設(shè)備的結(jié)果如下所示:

測(cè)試活動(dòng)如下所示:

package com.example.glcleartest;

import java.nio.Buffer;

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.opengl.GLES20;

import android.opengl.GLSurfaceView;

import android.opengl.GLSurfaceView.Renderer;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

public class MainActivity extends Activity {

protected static final int NUM_VERTICES = 3;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

GLSurfaceView glview = (GLSurfaceView) findViewById(R.id.glview);

glview.setEGLConfigChooser(false);

glview.setEGLContextClientVersion(2);

glview.setRenderer(new Renderer() {

private int programObject;

private FloatBuffer vertexBuffer;

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}

@Override

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

GLES20.glViewport(0, 0, width, height);

init();

}

@Override

public void onDrawFrame(GL10 gl) {

float x = 0.1f*(float) Math.sin(System.currentTimeMillis()/1000.0);

float[] vVertices = new float[]{x, 0.5f, 0.0f,

x-0.5f, -0.5f, 0.0f,

x+0.5f, -0.5f, 0.0f};

vertexBuffer.rewind();

vertexBuffer.put(vVertices);

vertexBuffer.rewind();

// Use the program object

GLES20.glUseProgram(programObject);

int handle = GLES20.glGetUniformLocation(programObject, "uColor");

float r = (float) (0.5f+Math.sin(System.currentTimeMillis()/1000.0));

float g = (float) (0.5f+Math.sin(System.currentTimeMillis()/300.0));

GLES20.glUniform4f(handle, r, g,0,1);

// Load the vertex data

GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);

GLES20.glEnableVertexAttribArray(0);

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);

}

private void error(String s) {

Log.e("GLTEST", s);

}

private int loadShader(int shaderType, String source) {

if (shaderType != GLES20.GL_FRAGMENT_SHADER && shaderType != GLES20.GL_VERTEX_SHADER) {

throw new RuntimeException("Illegal shader type");

}

int shader = GLES20.glCreateShader(shaderType);

if (shader != 0) {

GLES20.glShaderSource(shader, source);

GLES20.glCompileShader(shader);

int[] compiled = new int[1];

GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);

if (compiled[0] == 0) {

error("Could not compile shader :");

error(GLES20.glGetShaderInfoLog(shader));

GLES20.glDeleteShader(shader);

shader = 0;

throw new RuntimeException("Shader Syntax / compilation error");

}

}

return shader;

}

private void init() {

String vShaderStr = "attribute vec4 vPosition; \n" +

"void main() \n" + "{ \n" +

" gl_Position = vPosition; \n" +

"} \n";

String fShaderStr = "precision mediump float; \n" +

"uniform vec4 uColor;" +

"void main() \n" +

"{ \n" +

" gl_FragColor = uColor; \n" +

"} \n";

ByteBuffer vbb = ByteBuffer.allocateDirect(NUM_VERTICES*3*4);

vbb.order(ByteOrder.nativeOrder());

vertexBuffer = vbb.asFloatBuffer();

int vertexShader;

int fragmentShader;

// Load the vertex/fragment shaders

vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vShaderStr);

fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fShaderStr);

// Create the program object

programObject = GLES20.glCreateProgram();

if (programObject == 0)

return;

GLES20.glAttachShader(programObject, vertexShader);

GLES20.glAttachShader(programObject, fragmentShader);

// Bind vPosition to attribute 0

GLES20.glBindAttribLocation(programObject, 0, "vPosition");

// Link the program

GLES20.glLinkProgram(programObject);

int[] linkStatus = new int[1];

GLES20.glGetProgramiv(programObject, GLES20.GL_LINK_STATUS, linkStatus, 0);

if (linkStatus[0] != GLES20.GL_TRUE) {

error("Could not link program: ");

error(GLES20.glGetProgramInfoLog(programObject));

GLES20.glDeleteProgram(programObject);

programObject = 0;

}

}

});

}

}

總結(jié)

以上是生活随笔為你收集整理的android清空frame,android – GLSurfaceView onDrawFrame清除行为的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。