大家好。
今天在学习opengl的,到了纹理贴图这里,按照“生成纹理 -> 绑定纹理 -> 画图”的步骤进行,发现几何图形可以画出来,但是纹理却死活没有出来。尝试了各种设置,都不行,不知道哪里出了问题。现在我把代码贴出来,希望有经验的朋友能给我一点指点。希望大家不吝赐教。
package com.gl;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import test.opengl.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.opengl.GLUtils;
import android.opengl.GLSurfaceView.Renderer;
public class OpenGlRender implements Renderer {
private float z = -1;
private float[] vertices = {
0, 0, z,
1, 0, z,
1, 1, z,
0, 1, z,
-1, 1, z,
-1, 0, z,
-1, -1, z,
0, -1, z,
1, -1, z
};
private float[] colors = {
1, 0, 0, 1, //r, g, b, a
0, 1, 0, 1,
0, 0, 1, 1,
1, 1, 0, 1
};
private float[] texCoor = {
0f, 0f,
1f, 0f,
0f, 1f,
1f, 1f
};
private FloatBuffer _clrBuffer;
private ShortBuffer _indexBuffer;
private FloatBuffer _vertexBuffer;
private FloatBuffer _texBuffer;
private int _nrOfVertices = 4;
private int[] mTexIds = new int[2];
private Bitmap mBm;
private Context mCtx;
OpenGlRender(Context ctx){
mCtx = ctx;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);
mBm = BitmapFactory.decodeResource(mCtx.getResources(), R.drawable.fig01_d);
updateBitmap(mBm);
gl.glGenTextures(1, mTexIds, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexIds[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBm, 0);
mBm.recycle();
initTriangle();
}
private void updateBitmap(Bitmap src){
if(src == null)
return;
int w = pow2(src.getWidth());
int h = pow2(src.getHeight());
Bitmap b = Bitmap.createBitmap(w, h,
src.hasAlpha() ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas c = new Canvas(b);
c.drawBitmap(src, 0, 0, null);
src = b;
}
private int pow2(float val){
int x = (int) (Math.log(val) / Math.log(2));
if((1 << x) >= val)
return 1 << x;
else
return 1 << (1 + x);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
}
private float angle = 0;
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glClearColor(0, 0, 1.0f, 1.0f);
gl.glColor4f(1f, 0f, 0f, 1f);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _texBuffer);
//size: number of coordinates per vertex;
//stride: offset between 2 consecutive vertices;
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
//gl.glColorPointer(4, GL10.GL_FLOAT, 0, _clrBuffer);
//gl.glDrawElements(GL10.GL_TRIANGLE_FAN, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, _nrOfVertices);
angle++;
}
private void initTriangle() {
// float has 4 bytes
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
_vertexBuffer = vbb.asFloatBuffer();
_vertexBuffer.put(vertices);
_vertexBuffer.position(0);
// short has 4 bytes
ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);
ibb.order(ByteOrder.nativeOrder());
_indexBuffer = ibb.asShortBuffer();
for(short i = 0; i < _nrOfVertices; i++){
_indexBuffer.put(i, i);
}
_indexBuffer.position(0);
ByteBuffer clr= ByteBuffer.allocateDirect(colors.length * 4);
clr.order(ByteOrder.nativeOrder());
_clrBuffer = clr.asFloatBuffer();
_clrBuffer.put(colors);
_clrBuffer.position(0);
ByteBuffer tex = ByteBuffer.allocate(texCoor.length * 4);
tex.order(ByteOrder.nativeOrder());
_texBuffer = tex.asFloatBuffer();
_texBuffer.put(texCoor);
_texBuffer.position(0);
}
}
相关推荐
Tobit与Probit模型Stata实现代码-最新发布.zip
Jupyter-Notebook
红警单机版(单机游戏)
SwiftUI编写的贪吃蛇小游戏讲解
1996-2020年中国文化旅游统计年鉴-最新数据发布.zip
Jupyter-Notebook
omwfa1hxz_1.apk
2001-2023年上市公司大数据应用指数数据集(6.1万样本,5600家企业,含原始数据、代码及结果,最新).zip
Jupyter-Notebook
Typora(version 1.2.3)导出 pdf 自定义水印的 frame.js 文件,详情可以查看:
量产部落sm2263xt开卡工具,支持b16b17颗粒
中国1公里分辨率月降水数据-最新全集.zip
云平台VPC.vsdx
CPA注会考试最新教材资料-最新发布.zip
分省最低工资标准面板数据最新集.zip
内容概要:本文档是一份详尽的Java面试题集,涵盖了许多常见的Java面试问题及详细的解答。内容涉及Java基础语法、面向对象编程、集合框架、网络编程、Spring框架等多个方面。每个问题不仅提供了答案,还解释了其背后的原理和技术细节。 适合人群:即将参加Java岗位面试的技术人员,特别是工作经验1-3年的软件工程师。 使用场景及目标:适用于准备Java面试,加深对Java核心技术的理解和掌握。通过练习这些问题,帮助面试者更好地理解和应对面试官的问题。 阅读建议:建议结合实际项目经验来阅读和练习这些问题,以便更好地理解和应用所学的知识点。同时,对于复杂的问题,可以通过编写代码来验证答案的正确性和理解深度。
层次分析法与熵值法工具包+数据案例+代码-最新.zip
音乐产品购物网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
NASA DEM中国30省高分辨率地形数据-精心整理.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。