androidStudio编写的你好三角形的opengl程序图形出不来,找了好几天了,未果,求大神指点

stone_js 2017-09-29 09:09:49
MainActivity代码:

package com.kingzone3d.testopenglsufaceview;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.kingzone3d.testopenglsufaceview.MainActivity">

<com.kingzone3d.testopenglsufaceview.MyGLView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</LinearLayout>


MyGLView的代码

package com.kingzone3d.testopenglsufaceview;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;

/**
* Created by JS on 2017/9/28.
*/

public class MyGLView extends GLSurfaceView{
private MyRenderer mRenderer;
public MyGLView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setEGLContextClientVersion(2);
mRenderer = new MyRenderer();
this.setRenderer(mRenderer);
this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
}

MyRenderer代码:

package com.kingzone3d.testopenglsufaceview;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

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

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

/**
* Created by JS on 2017/9/28.
*/

public class MyRenderer implements MyGLView.Renderer{
int iProgramID;
FloatBuffer mVertexPosiBuffer;
int aPosiHandle;

@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
final float fVertex[] = { //x,y,z,s1,t1,s2,t2
-1.0f, 1.0f, 0.0f, 0.0f,//0.0f, 1.0f, 0.5f, 1.0f,
1.0f, -1.0f, 0.0f, 0.0f,
-1.0f, -1.0f, 0.0f, 0.0f//, // -0.0f,//0.0f, 0.0f, 0.5f, 0.0f,
//1.0f, -1.0f, 0.0f, 0.0f//, -0.0f//, //0.5f, 0.0f, 1.0f, 0.0f,
//1.0f, 1.0f, -0.0f //, 0.5f, 1.0f, 1.0f, 1.0f
};

iProgramID = MyShaderUtils.createGlProgram();
aPosiHandle = GLES20.glGetAttribLocation(iProgramID, "aPosition");
mVertexPosiBuffer = ByteBuffer.allocateDirect(fVertex.length * 4).asFloatBuffer().put(fVertex);
}

@Override
public void onSurfaceChanged(GL10 gl10, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}

@Override
public void onDrawFrame(GL10 gl10) {
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glUseProgram(iProgramID);
mVertexPosiBuffer.position(0);
GLES20.glVertexAttribPointer(aPosiHandle, 4, GLES20.GL_FLOAT, false, 0, mVertexPosiBuffer);
GLES20.glEnableVertexAttribArray(aPosiHandle);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
GLES20.glFlush();
}
}

ShaderUtils代码:

package com.kingzone3d.testopenglsufaceview;

/**
* Created by JS on 2017/9/28.
*/

import android.opengl.GLES20;

import android.opengl.GLES20;
import android.opengl.GLES30;
import android.util.Log;

/**
* Created by JS on 2017/9/20.
*/

public class MyShaderUtils {
private static final String TAG = "ShaderUtils";
public static void checkGlError(String lable){
int error;
while((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR){
Log.e(TAG, lable + "checkGlError: " + error);
throw new RuntimeException(lable + ":glError" + error);
}
}

public static int createGlProgram()
{
StringBuilder sbv = new StringBuilder();
sbv.append("attribute vec4 aPosition;\n");
sbv.append("void main(){\n");
sbv.append("gl_Position=aPosition;\n");
sbv.append("}\n");
final String vertexShaderCode = sbv.toString();

StringBuilder sbf = new StringBuilder();
sbf.append("precision mediump float;\n");
sbf.append("void main(){\n");
sbf.append("gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);\n");
sbf.append("}\n");
final String fragmentShaderCode=sbf.toString();


int vertexShader = createShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
if(vertexShader == 0){
return 0;
}
int fragmentShader = createShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
if(fragmentShader == 0){
GLES20.glDeleteShader(vertexShader);
return 0;
}

int program = GLES20.glCreateProgram();
if(program == 0) {
GLES20.glDeleteShader(vertexShader);
GLES20.glDeleteShader(fragmentShader);
return 0;
}

GLES20.glAttachShader(program, vertexShader);
checkGlError("glAttachShader");
GLES20.glAttachShader(program, fragmentShader);
checkGlError("glAttachShader");
GLES20.glLinkProgram(program);
int[] linkStatus = new int[1];
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
if(linkStatus[0] != GLES20.GL_TRUE){
Log.e(TAG, "Could not link program:");
Log.e(TAG, GLES20.glGetProgramInfoLog(program));
GLES20.glDeleteProgram(program);
program = 0;
}

return program;
}
public static int createShader(int shaderType, String source){
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) {
Log.e(TAG, "Could not compile shader ");
Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
String sInfor = GLES20.glGetShaderInfoLog(shader);
GLES20.glDeleteShader(shader);
shader = 0;
}
}
return shader;
}
}

...全文
193 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
1.物联网的开发难度越来越低当小王被老板要开发一个物联网项目时,他面临这许多种解决方案,从硬件到软件一应俱全。有的提供了模块化的硬件,有的提供了高度集成的软件开发环境,有的支持python开发,有的支持图形化开发,有的提供硬件SDK,有的提供从云端到移动端成套的解决方案。小王该如何选择?的确,物联网的开发难度越来越低,只要你想,就可以拖拖拽拽做出来一个简单的设备。移动端APP呢?也是如此,你甚至可以登陆某平台的网站在线生成一个安装包直接安装到手机上。但是这些便利化的前提是失去对核心技术的掌握,以及跳转界面、使用习惯等无法把控。2.移动端APP技能是必备当学习物联网技术的小赵到某公司应聘时,公司技术主管对他的知识结构基本满意。然后让他开发一个物联网项目,要软硬件结合,移动端APP是必备的。小赵可以很快做出来一台基于ESP8266的硬件设备,连接到某物联网平台,做出来一个手机端的APP。但是主管对这个APP不太满意,问小赵自己会不会制作手机APP?小赵有些尴尬。为什么移动端APP技能是必备?因为物联网技术涉及到的知识领域有很多个,能够自己做出APP才算是将这些领域的知识完全掌握。就像是一个侠客的武功,最厉害的那个还没有练成,还不能算是真正的高手。3.定制APP价格很贵市场上有不少的物联网软件公司开展物联网应用APP的定制业务,当然价格不菲。如果是公司采购,你将花费较大的价格采购到一个未来并不可控的APP。反过来说,如果是学生应聘,你学到移动端应用知识,将大大提升你的竞争力,你的技能将成为核心竞争力。4.没有类似的教程原因就不多说了。即使有一些片段代码给了大家,大家也做不出来一个能用的APP。5.本课程要讲什么基于阿里云物联网平台(其他物联网平台类似),带您使用Android Studio编写一个安卓APP,实现连接阿里云物联网平台,控制一台智能灯。通过一个软硬件结合项目,结合源代码,一点一点为大家讲解怎么样连接阿里云物联网平台,每一个步骤是怎么回事,源代码怎么实现。为了照顾一些零基础的朋友,课程中还会用一些通俗的语言介绍这些知识,让大家掌握书上和网络上一些不太注意的技术细节。  

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧