opengles吧 关注:83贴子:119
  • 0回复贴,共1

关于OpenGL ES的一个问题求解

只看楼主收藏回复

这是来自于《OpenGL ES应用开发实践》一书的Demo,代码如下,可以运行,但无法显示出图形,求大神解决
>>>AirHockeyActivity
package com.light.demo;
import android.app.*;
import android.os.*;
import android.opengl.*;
import android.content.*;
import android.content.pm.*;
import android.widget.*;
public class AirHockeyActivity extends Activity
{
private GLSurfaceView glSurfaceView;
private boolean rendererSet=false;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
glSurfaceView=new GLSurfaceView(this);
//设备是否支持opengl es 2.0
final ActivityManager activityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo=activityManager.getDeviceConfigurationInfo();
final boolean supportsEs3=configurationInfo.reqGlEsVersion>=0x20000;
if(supportsEs3){
glSurfaceView.setEGLContextClientVersion(2);
glSurfaceView.setEGLConfigChooser(8,8,8,8,16,0);
glSurfaceView.setRenderer(new AirHockeyRenderer(this));
rendererSet=true;
}else{
Toast.makeText(getApplicationContext(),"This Device don't support OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
return;
}
//初始化上下文
setContentView(glSurfaceView);
}
@Override
protected void onPause()
{
super.onPause();
if(rendererSet){
glSurfaceView.onPause();
}
}
@Override
protected void onResume()
{
super.onResume();
if(rendererSet){
glSurfaceView.onResume();
}
}
}
>>>AirHockeyRenderer
package com.light.demo;
import android.opengl.GLSurfaceView.Renderer;
import javax.microedition.khronos.opengles.*;
import javax.microedition.khronos.egl.*;
import android.opengl.GLES20.*;
import java.nio.*;
import com.light.demo.util.TextResourceReader;
import android.content.*;
import com.light.demo.util.*;
import android.opengl.*;
public class AirHockeyRenderer implements Renderer
{
//每个量有两个分量
private static final int POSITION_COMPONENT_COUNT=2;
//每个float占的bit数
private static final int BYTES_PRE_FLOAT=4;
//储存u_Color位置
private static final String U_COLOR="u_Color";
private int uColorLocation;
//储存u_Color位置
private static final String A_POSITION="a_Position";
private int aPositionLocation;
private final FloatBuffer vertexData;
private final Context context;
private int program;
public AirHockeyRenderer(Context context){
this.context=context;
//图形
float tableVerticesWithTriangles[]={
//Table
-0.5f,-0.5f,
0.5f,0.5f,
-0.5f,0.5f,
-0.5f,-0.5f,
0.5f,-0.5f,
0.5f,0.5f,
//line
-0.5f,0f,
0.5f,0f,
//mallets
0.25f,-0.25f,
0.25f,0.25f
};
//创建一块本地内存
vertexData=ByteBuffer.allocateDirect(tableVerticesWithTriangles.length*BYTES_PRE_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
}
@Override
public void onSurfaceCreated(GL10 gl, javax.microedition.khronos.egl.EGLConfig glc)
{
//设置背景
GLES20.glClearColor(0, 0, 0, 0);
//开启深度检测
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
String vertexShaderSource=TextResourceReader.readTextFileFromResource(context,R.raw.simple_vertex_shader);
String fragmentShaderSource=TextResourceReader.readTextFileFromResource(context,R.raw.simple_fragment_shader);
int vertexShader=ShaderHelper.compileVertexShader(vertexShaderSource);
int fragmentShader=ShaderHelper.compileFragmentShader(fragmentShaderSource);
program=ShaderHelper.linkProgram(vertexShader,fragmentShader);
if(LoggerConfig.ON){
ShaderHelper.validateProgram(program);
}
//告诉opengl绘制方法
GLES20.glUseProgram(program);
//找到位置
uColorLocation=GLES20.glGetUniformLocation(program,U_COLOR);
aPositionLocation=GLES20.glGetAttribLocation(program,A_POSITION);
//复制到缓冲区内
vertexData.position(0);
//属性位置 数据计数 \\ \\ 数据位置
GLES20.glVertexAttribPointer(aPositionLocation,POSITION_COMPONENT_COUNT,GLES20.GL_FLOAT,false,0,vertexData);
GLES20.glEnableVertexAttribArray(aPositionLocation);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
gl.glViewport(0, 0, width, height);
// make adjustments for screen ratio(近平面)
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
// set matrix to projection mode
gl.glLoadIdentity();
// reset the matrix to its default state
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 20);
// apply the projection matrix(设置近平面,远平面)
}
@Override
public void onDrawFrame(GL10 gl)
{
//刷新
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
//绘制table
//颜色
GLES20.glUniform4f(uColorLocation,1f,1f,1f,1f);
//三角形 开始 读取个数
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,6);
//绘制线
GLES20.glUniform4f(uColorLocation,1f,0f,0f,1f);
GLES20.glDrawArrays(GLES20.GL_LINES,6,2);
//绘制木槌
GLES20.glUniform4f(uColorLocation,0f,0f,1f,1f);
GLES20.glDrawArrays(GLES20.GL_POINTS,8,1);
GLES20.glUniform4f(uColorLocation,0f,0f,1f,1f);
GLES20.glDrawArrays(GLES20.GL_POINTS,9,1);
}
}
>>>ShaderHelper
package com.light.demo.util;
import android.opengl.GLES20.*;
import android.opengl.GLUtils.*;
import android.


IP属地:广东1楼2018-07-25 19:50回复