有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何获得要渲染的纹理

我在拔头发。我已经试了5个小时,想在这个广场上得到一个奇怪的纹理,但似乎无法实现。在这一点上,我已经屠宰了这个代码,四处移动,试图让它工作,但这里是我所拥有的

它创建了一个旋转的正方形,根据所接触的坐标以一定的速度旋转。 这一切都很好,但就我个人而言,我无法画出纹理。我需要改变什么

这是整个渲染器类

public class VortexRenderer implements GLSurfaceView.Renderer {
    private static final String LOG_TAG = VortexRenderer.class.getSimpleName();

    private float _red = 0.9f;
    private float _green = 0.2f;
    private float _blue = 0.2f;
    public Bitmap bitmap;

    public VortexRenderer(Context context) {
        // TODO Auto-generated constructor stub
        bitmap = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.texturetest);

    }


    private FloatBuffer mTextureBuffer;
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        int[] textures = new int[1];
     // Tell OpenGL to generate textures.
        gl.glGenTextures(1, textures, 0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[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);
        float textureCoordinates[] = {0.0f, 1.0f,
                1.0f, 1.0f,
                0.0f, 0.0f,
                1.0f, 0.0f };
        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, bitmap, 0);

        ByteBuffer byteBuf = ByteBuffer.allocateDirect(textureCoordinates.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        mTextureBuffer = byteBuf.asFloatBuffer();
        mTextureBuffer.put(textureCoordinates);
        mTextureBuffer.position(0);

            gl.glEnable(GL10.GL_TEXTURE_2D);
         // Tell OpenGL where our texture is located.
         gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
         // Tell OpenGL to enable the use of UV coordinates.
         gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
         // Telling OpenGL where our UV coordinates are.
         gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);

        initTriangle();

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int w, int h) {
        gl.glViewport(0, 0, w, h);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
         // define the color we want to be displayed as the "clipping wall"
        gl.glClearColor(_red, _green, _blue, 1.0f);

        // clear the color buffer to show the ClearColor we called above...
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        gl.glRotatef(_angle, 0f, 1f, 0f);
        // set the color of our element
        gl.glColor4f(0.5f, 0f, 0f, 0.5f);

        // define the vertices we want to draw
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        // Enable the texture state
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        // Point to our buffers
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);



        // finally draw the vertices
        gl.glDrawElements(GL10.GL_TRIANGLE_FAN, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);




   }


    private float _angle;

    public void setAngle(float angle) {
        _angle = angle;
    }


    public void setColor(float r, float g, float b) {
        _red = r;
        _green = g;
        _blue = b;
    } 

     // new object variables we need
     // a raw buffer to hold indices
     private ShortBuffer _indexBuffer;

     // a raw buffer to hold the vertices
     private FloatBuffer _vertexBuffer;

     private short[] _indicesArray = {0, 1 ,2,3};
     private int _nrOfVertices = 4;



     private void initTriangle() {

         // float has 4 bytes
         ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 4 * 4);
         vbb.order(ByteOrder.nativeOrder());
         _vertexBuffer = vbb.asFloatBuffer();

         // short has 2 bytes
         ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);
         ibb.order(ByteOrder.nativeOrder());
         _indexBuffer = ibb.asShortBuffer();

         float[] coords = {
            -0.5f, -0.5f, 0f, // (x1, y1, z1)
             0.5f, -0.5f, 0f, // (x2, y2, z2)
             0.5f, 0.5f, 0f, // (x3, y3, z3)
             -0.5f, 0.5f, 0f
         };

         _vertexBuffer.put(coords);
         _indexBuffer.put(_indicesArray);

         _vertexBuffer.position(0);
         _indexBuffer.position(0);
     }
}

我知道很多东西都放在奇怪的地方,我真的花了好几个小时来移动这些东西,想让它们发挥作用

OpenGL ES当然更值得学习


共 (1) 个答案

  1. # 1 楼答案

    试着打电话

    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
    

    设置纹理参数后
    此外,通常最好确保纹理尺寸是2的倍数(例如32x32、64x64、128x128…)在openGL中工作时