我试图将2个三角形绘制成一个矩形,并在其上绘制整个纹理,我认为它只是1.0坐标。我得到一个带有许多微小褪色纹理的三角形。我对opengl很新,有点失去这些电话的动态。 有没有人在我的QUAD课程中看到任何明显错误的东西,比如我的坐标错误或绘图顺序错误?
public class MyRenderer implements GLSurfaceView.Renderer {
private Quad myquad;
private Context context;
int texture[] = new int[1];
private int width,height;
int x,y;
private long startframe,timediff,sleeptime,frameskip;
private final static int MAX_FPS = 25;
private final static int MAX_FRAME_SKIPS = 5;
private final static int FRAME_PERIOD = 1000/MAX_FPS;
private static Direction move_direction=Direction.NONE;
public MyRenderer (Context context){
this.myquad = new Quad();
this.context = context;
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
myquad.loadGLTexture(gl, this.context);
//turn on alpha blending
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(gl.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glDisable(GL10.GL_DEPTH_TEST);
x=y=0;
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
width=w;
height=h;
gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL10.GL_PROJECTION); //Select The Projection Matrix
gl.glLoadIdentity();
gl.glOrthof(0.0f, 320, 0.0f, 480, 1.0f, -1.0f);
}
public void onDrawFrame(GL10 gl) {
startframe=SystemClock.elapsedRealtime();
// define the color we want to be displayed as the "clipping wall"
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// clear the color buffer to show the ClearColor we called above...
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// gl.glLoadIdentity();
switch (move_direction)
{
case UP:
gl.glTranslatef(0, 1, 0);
y=y+1;
break;
case DOWN:
gl.glTranslatef(0, -1, 0);
y= y-1;
break;
case LEFT:
gl.glTranslatef(-1, 0, 0);
x=x-1;
break;
case RIGHT:
gl.glTranslatef(1, 0, 0);
x=x+1;
break;
case NONE:
//gl.glTranslatef(0, 0, 0);
break;
}
myquad.Draw(gl);
class Quad {
private FloatBuffer vertices;
private int[] textures = new int[1];
private ShortBuffer indexbuffer;
//private float vertices[] = {
// 50.0f, 50.0f, // 0.
// 100.0f, 50.0f, // 1.
// 100.0f, 100.0f, // 2.
// 50.0f, 100.0f // 3.
//};
private float texture[] = {
0.0f, 0.0f, //0
1.0f, 0.0f, //1
1.0f, 1.0f, //2
1.0f, 0.0f //3
};
private short indices[] = {0,1,2,0,3,2};
public Quad(){
try
{
float[] coords={50.0f, 50.0f, //0
300.0f,50.0f, //1
300.0f, 300.0f, //2
300.0f, 50.0f}; //3
short[] indices = {0,1,2,0,3,2};
ByteBuffer verticesbuffer = ByteBuffer.allocateDirect(coords.length*4);
verticesbuffer.order(ByteOrder.nativeOrder());
vertices = verticesbuffer.asFloatBuffer();
vertices.put(coords);
//vertices.position(0);
vertices.flip();
ByteBuffer idb = ByteBuffer.allocateDirect(indices.length * 2);
idb.order(ByteOrder.nativeOrder());
indexbuffer = idb.asShortBuffer();
indexbuffer.put(indices);
//indexbuffer.position(0);
indexbuffer.flip();
}catch(Exception e)
{
Log.d("buffers","not working",e);
}
}
public void loadGLTexture(GL10 gl, Context context) {
//Get the texture from the Android resource directory
//Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.herowalkback);
try
{
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.herowalkback);
if (bitmap == null)
{
Log.i ("info", "bitmap could not be decoded");
}
//Generate one texture pointer...
gl.glGenTextures(1, textures, 0);
//...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//Create Nearest Filtered Texture
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.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
//Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,bitmap, 0);
//Clean up
bitmap.recycle();
}catch(Exception e)
{
Log.d("load texture","not working");
}
}
public void Draw(GL10 gl)
{
// set the color for the triangle
gl.glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
//Enable the vertex and texture state
vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices);
vertices.position(2);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, vertices);
// Draw the vertices as triangle strip
gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_SHORT, indexbuffer);
}
}
public class test extends Activity {
private GLSurfaceView glsurface;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
glsurface = new GLSurfaceView(this);
glsurface.setRenderer(new MyRenderer(this));
setContentView(glsurface);
glsurface.setOnKeyListener(watchkeys);
glsurface.setFocusable(true);
glsurface.setFocusableInTouchMode(true);
}
答案 0 :(得分:0)
你没有做错任何事。这称为纹理映射,您需要习惯这种情况。
因此,例如,请记住,要使用0.0和1.0水平绘制三角形(x坐标)。如果涉及两个三角形,则需要相应地划分坐标。所以它是0.0,0.5,1.0。对于Y轴也一样。
理想情况下,您可以使用像Blender这样的建模工具来对您的对象进行纹理贴图,因此您不必担心将1.0划分为x个三角形。