opengles 2.0如何绘制纹理

以下代码实现了绘制正方形,但是绘制纹理就崩溃了。
原因是加了下面2句:
"attribute vec2 aTextureCoord;\n" + 光加这个不会崩溃,
mTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord"); 这句崩溃了

public class MyRenderer implements Renderer {


private Bitmap mBitmap = null;
private float[] mVMatrix = new float[16];
    private float[] mProjMatrix = new float[16];
    private float[] mMVPMatrix = new float[16];

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

bulidProgram();

Matrix.setLookAtM(mVMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
}

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

float ratio = (float) width / height;
        Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
GLES20.glUseProgram(mProgram);

mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config .ARGB_8888);
mBitmap.eraseColor(Color.BLUE);
}

@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// GLES20.glUseProgram(mProgram);
        
        Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);// 应用投影和视口变换

        drawImage();
        drawSquare();
}


static final int COORDS_PER_IMAGE_VERTEX = 2;
private FloatBuffer mImageCubeVertices;
    private FloatBuffer mTTextureVertices;
final float cubePosition[] =  { 
-1.0f, 1.0f,
-1.0f, -1.0f,
1.0f, 1.0f,
-1.0f, -1.0f,
1.0f, -1.0f,
1.0f, 1.0f,
};
    final float cubeColor[] = {     
     0.0f, 0.0f, 1.0f, 1.0f};

    final float cubeTextureCoordinate[] = {  
     0.0f, 0.0f,   
     0.0f, 1.0f,   
     1.0f, 0.0f,   
     0.0f, 1.0f,   
     1.0f, 1.0f,   
     1.0f, 0.0f};


private void drawImage() {
GLES20.glEnable(GLES20.GL_TEXTURE_2D);// 启用2D纹理贴图
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);


        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

        if (null == mBitmap || mBitmap.isRecycled()) {
         return;
        }
        else {
         GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, mBitmap, 0);
        }
        GLES20.glDeleteTextures(1, textures, 0);

mImageCubeVertices = ByteBuffer.allocateDirect(cubePosition.length * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
mImageCubeVertices.put(cubePosition).position(0);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_IMAGE_VERTEX, GLES20.GL_FLOAT, false, cubePosition.length * COORDS_PER_IMAGE_VERTEX, mImageCubeVertices);
// Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, cubeColor, 0);
        
        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);

        mTTextureVertices = ByteBuffer.allocateDirect(cubeTextureCoordinate.length * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
        mTTextureVertices.put(cubeTextureCoordinate).position(0);
        GLES20.glVertexAttribPointer(mTextureHandle, 2, GLES20.GL_FLOAT, false, COORDS_PER_IMAGE_VERTEX * BYTES_PER_FLOAT, mTTextureVertices);
        GLES20.glEnableVertexAttribArray(mTextureHandle);
        

        GLES20.glDisableVertexAttribArray(mPositionHandle);// Disable vertex array
}

/
    static final int COORDS_PER_SQUARE_VERTEX = 2;
private FloatBuffer mSquareVertexBuffer;
private ShortBuffer mSquareIndexBuffer;
private void drawSquare() {
createRectangle();
        float squareColor[] = { 0.0f, 1.0f, 0.0f, 1.0f };

        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_SQUARE_VERTEX, GLES20.GL_FLOAT, false, COORDS_PER_SQUARE_VERTEX * BYTES_PER_FLOAT, mSquareVertexBuffer);// 每个顶点只有(x,y)2个点
        // Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, squareColor, 0);
        
        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);

//        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, squareCoords.length * COORDS_PER_SQUARE_VERTEX);// Draw the triangle
     // Draw the square
        GLES20.glDrawElements(
                GLES20.GL_TRIANGLES, squareIndex.length,
                GLES20.GL_UNSIGNED_SHORT, mSquareIndexBuffer);
        GLES20.glDisableVertexAttribArray(mPositionHandle);// Disable vertex array
}

    private void createRectangle() {
        ByteBuffer vbb  = ByteBuffer.allocateDirect(squareCoords.length * BYTES_PER_FLOAT);
        vbb.order(ByteOrder.nativeOrder());
        mSquareVertexBuffer = vbb.asFloatBuffer();
        mSquareVertexBuffer.put(squareCoords);
        mSquareVertexBuffer.position(0);

        ByteBuffer ibb = ByteBuffer.allocateDirect(squareIndex.length * 2);
        ibb.order(ByteOrder.nativeOrder());
        mSquareIndexBuffer = ibb.asShortBuffer();
        mSquareIndexBuffer.put(squareIndex);
        mSquareIndexBuffer.position(0);
    }
short squareIndex[] = { 0, 1, 2, 0, 2, 3 };// 设置顶点的绘制顺序

static float squareCoords[] = {
-0.4f,  0.4f,// 左上
-0.4f, -0.4f,// 左下
0.4f, -0.4f,// 右下
0.4f,  0.4f };// 右上

private int mProgram = 0;
    private int mMVPMatrixHandle = -1;
private int mPositionHandle = -1;
private int mColorHandle = -1;
    private int mTextureHandle;
private boolean bulidProgram() {
mProgram = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);
if (0 == mProgram) {
return false;
}

mPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
        if (-1 == mPositionHandle) {
            throw new RuntimeException("Could not get attrib location for aPosition");
        }
                
        mTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
        if (-1 == mTextureHandle) {
            throw new RuntimeException("Could not get attrib location for aTextureCoord");
        }
        
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        if (-1 == mColorHandle) {
            throw new RuntimeException("Could not get attrib location for vColor");
        }

mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
        if (-1 == mMVPMatrixHandle) {
            throw new RuntimeException("Could not get attrib location for uMVPMatrix");
        }

return true;
}
    
    private int createProgram(String vertexSource, String fragmentSource) {
        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
        if (0 == vertexShader) {
            return 0;
        }

        int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
        if (0 == pixelShader) {
            return 0;
        }

        int program = GLES20.glCreateProgram();
        if (0 != program) {
            GLES20.glAttachShader(program, vertexShader);
            GLES20.glAttachShader(program, pixelShader);
            GLES20.glLinkProgram(program);

            int[] linkStatus = new int[1];
            GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
            if (GLES20.GL_TRUE != linkStatus[0]) {// 链接失败
                GLES20.glDeleteProgram(program);
                program = 0;
            }
        }
        return program;
    }

    private int loadShader(int shaderType, String source) {
        int shader = GLES20.glCreateShader(shaderType);
        if (0 != shader) {
            GLES20.glShaderSource(shader, source);
            GLES20.glCompileShader(shader);
            int[] compiled = new int[1];
            GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
            if (0 == compiled[0]) {
                GLES20.glDeleteShader(shader);
                shader = 0;
            }
        }
        return shader;
    }



    private final String VERTEX_SHADER =
        // This matrix member variable provides a hook to manipulate
        // the coordinates of the objects that use this vertex shader
        "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec2 aTextureCoord;\n" +
        "void main() {\n" +
        // the matrix must be included as a modifier of gl_Position
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "}\n";

    private final String FRAGMENT_SHADER =
        "precision mediump float;\n" +
        "uniform vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_FragColor = vColor;\n" +
        "}\n";
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《OpenGL ES 2.0编程指南》是一本介绍OpenGL ES 2.0的编程技术和方法的指南。OpenGL ES(OpenGL for Embedded Systems)是一套专为嵌入式系统和移动设备设计的2D和3D图形API,而OpenGL ES 2.0是其中的版本之一。 这本指南首先介绍了OpenGL ES 2.0编程的基础知识,包括OpenGL ES的特性和架构,以及基本的绘制流程。然后,它详细介绍了OpenGL ES 2.0的着色器编程,包括顶点着色器和片段着色器。着色器编程是OpenGL ES 2.0的核心,通过编写和使用着色器代码,开发者可以灵活地控制和定制图形渲染的各个环节。 此外,该指南还介绍了OpenGL ES 2.0的纹理映射、混合、剪裁和光照等高级技术。纹理映射可以让开发者在场景中添加细节和图案,混合可以实现透明效果,剪裁可以限制绘制的区域,光照可以增强场景的真实感。 《OpenGL ES 2.0编程指南》还提供了丰富的实例代码和实践案例,让读者能够通过实际操作深入理解OpenGL ES 2.0的编程方法和技巧。通过学习和掌握本书的内容,读者可以成为一名优秀的OpenGL ES 2.0开发者,能够开发出高性能、高质量的嵌入式图形应用程序。 总之,《OpenGL ES 2.0编程指南》是一本权威、全面且具有实践性的指南,对想要学习和应用OpenGL ES 2.0的开发者来说是一本非常有价值的参考书。 ### 回答2: 《OpenGLES2.0编程指南》是一本介绍OpenGL ES 2.0编程的指南书籍。OpenGL ES是一种针对移动设备和嵌入式系统的图形库,而OpenGL ES 2.0是其最新版本,提供了强大的图形渲染功能和灵活的编程接口。 这本书以深入浅出的方式介绍了OpenGL ES 2.0的基本概念、渲染管线、顶点和片元着色器、纹理映射、渲染缓冲区和帧缓冲区等核心知识。读者可以通过学习本书,了解到如何利用OpenGL ES 2.0编写高性能的图形应用程序。 在《OpenGLES2.0编程指南》中,作者还会通过大量的示例代码来演示如何使用OpenGL ES 2.0进行图形渲染。这些示例代码会涉及到常用的图形渲染技术,如图元绘制、光照、投影变换、深度测试等。读者可以通过对这些示例代码的学习和分析,更好地理解OpenGL ES 2.0的编程思想和技术要点。 此外,本书还介绍了一些常见的图形效果和优化技巧,如阴影、反射和抗锯齿等。这些内容对于那些希望提升图形应用程序性能和效果的开发者来说十分有用。 总的来说,《OpenGLES2.0编程指南》是一本全面而深入的OpenGL ES 2.0编程教材,适合那些想要学习OpenGL ES 2.0编程或者提升自己OpenGL ES 2.0编程技能的开发者阅读。通过学习本书,读者可以掌握OpenGL ES 2.0的基本知识和相关的编程技术,进一步提高自己在图形应用开发领域的水平。 ### 回答3: 《OpenGL ES 2.0编程指南》是一本深入解析OpenGL ES 2.0编程的指南。OpenGL ES(OpenGL for Embedded Systems)是为嵌入式设备和移动设备设计的精简版OpenGL。这本指南主要面向对OpenGL ES 2.0编程感兴趣的开发人员。 本书首先介绍了OpenGL ES 2.0的基本概念和工作原理。接着详细讲解了OpenGL ES 2.0的渲染管线、着色器语言以及顶点和片元着色器的编程。书中还提供了大量的示例代码和实践案例,帮助读者更好地理解各种概念和技术,并应用于实际项目中。 《OpenGL ES 2.0编程指南》还涵盖了纹理映射、深度缓冲、帧缓冲和多重渲染目标等高级主题。读者可以学习到如何使用这些高级功能实现更加复杂的图形效果。此外,书中还介绍了一些优化技巧和调试方法,帮助开发人员提高应用性能并排除错误。 这本指南对于初学者来说可能会有一些挑战,因为OpenGL ES 2.0的编程相对复杂。但对于有一定OpenGL基础的开发人员来说,它是一本非常有价值的参考书。作为一本权威的OpenGL ES 2.0编程指南,它提供了丰富的知识和实践经验,可以帮助读者掌握这一领域的核心技术和开发流程。 综上所述,《OpenGL ES 2.0编程指南》是一本深入介绍和解析OpenGL ES 2.0编程的权威指南。无论是初学者还是有经验的开发人员,都可以通过阅读这本书来学习和应用OpenGL ES 2.0的编程技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值