gpt4 book ai didi

java - OpenGL ES : Using Texture: Blank White instead of Texture Image

转载 作者:行者123 更新时间:2023-11-29 22:12:16 26 4
gpt4 key购买 nike

我在 Android 平台上编码。我正在尝试为三角形使用纹理(从 Assets 文件夹加载图像)。当我的应用程序运行时,它只是三角形中的空白白色(不是我想要的纹理)。

我读过一些其他资料,说图像必须是 2 的幂。我查过,我的形象是二的幂。 (128 × 128)。这就是为什么让我头疼的原因。

这是我的代码:(您应该在onDrawFrame 方法中看到的主要代码,它包含我用于渲染的代码)

package com.test;

import java.io.IOException;
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.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLUtils;
import android.os.Bundle;
import android.util.Log;

public class TextureTriangleTest extends Activity{

GLSurfaceView glView;
ByteBuffer byteBuffer;
FloatBuffer vertices;
AssetManager assets;

@Override
public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);
assets = getAssets();

int VERTEX_SIZE = (2+2)*4;
byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put(new float[] { 0.0f, 0.0f, 0.0f, 1.0f,
319.0f, 0.0f, 1.0f, 1.0f,
160.0f, 479.0f, 0.5f, 0.0f } );
vertices.flip();

glView = new GLSurfaceView(this);
glView.setRenderer(new Render());
setContentView(glView);

}



class Render implements Renderer{

@Override
public void onDrawFrame(GL10 gl) {

try {

Bitmap bitmap = BitmapFactory.decodeStream(assets.open("bobrgb888.png"));
int textureIds[] = new int[1];
gl.glGenTextures(1, textureIds, 0);
int textureId = textureIds[0];

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);

bitmap.recycle();

} catch (IOException e) {
Log.d("", "FAILED LOAD FILE");
throw new RuntimeException("Couldn't load asset!");
}

gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

int VERTEX_SIZE = (2+2)*4;
vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub

}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub

}

}

}

我的代码只是一个简单的例子。我有调试,一切都是真的。 (如:成功加载图片)。但是,我不知道如何调试 OpenGL 应用程序。 (这意味着:调试时,我可以查看变量的参数,但我不知道它是怎么回事,因为 OpenGL 比 Canvas 太复杂了——你只需使用一行代码就可以得到结果:))

感谢您的帮助:)

最佳答案

哦。我已经修复了我的全部解决方案,下面是我的完整代码。我在这里发帖是为了谁尝试阅读我的长篇文章 (^^) 并需要一个真正的解决方案 :) 感谢 SteveL 给我的建议 :)

在我的解决方案中,我有一些改变: 第一的。性能:我将代码读取纹理放在onSurfaceCreate 中。 第二。正如史蒂夫所说。我丢失了 gl.glEnable,我又重新设置了 gl.glBindTexture

再想想,我看到那些错误真的很愚蠢。只是因为我是 OpenGL 的新手 :(

package com.test;

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.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;

public class ColorTriangleTest extends Activity{

GLSurfaceView glView;
ByteBuffer byteBuffer;
FloatBuffer vertices;

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

int VERTEX_SIZE = (2+4)*4;
byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put(new float[] { 0.0f, 0.0f, 1, 0, 0, 1,
319.0f, 0.0f, 1, 1, 0, 1,
160.0f, 479.0f, 1, 0, 1, 1 });
vertices.flip();

glView = new GLSurfaceView(this);
glView.setRenderer(new Render());
setContentView(glView);
}

class Render implements Renderer {

@Override
public void onDrawFrame(GL10 gl) {

int VERTEX_SIZE = (2+4)*4;

gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 10, -10);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub

}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub

}

}

}

关于java - OpenGL ES : Using Texture: Blank White instead of Texture Image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com