问题描述
我正在尝试在glsurfaceview上显示位图图像,并且能够做到这一点。 我正在从文件读取的位图及其需要放置的位置。
我的屏幕是2324x1080 我正在尝试在中心绘制一个90x60的小位图,但它比原本应该的要大得多。
对此没有任何解释,我也不愿意将其缩放,因为实际上我不知道什么是缩放的位图。
这是我的代码: GLSL:
public static final String VERTEX_SHADER_CODE =
"uniform mat4 " + MVPMATRIX_ParaM + ";" +
"attribute vec4 " + POSITION_ParaM + ";" +
"attribute vec2 " + TEXTURE_COORDINATE_ParaM + ";" +
"varying vec2 vTexCoordinate;" +
"void main() {" +
" gl_Position = " + MVPMATRIX_ParaM + " * " + POSITION_ParaM + ";" +
" vTexCoordinate = " + TEXTURE_COORDINATE_ParaM + ";" +
"}";
public static final String FRAGMENT_SHADER_CODE =
"precision mediump float;" +
"uniform sampler2D uTexture;" +
"varying vec2 vTexCoordinate;" +
"void main() {" +
" gl_FragColor = texture2D(uTexture,vTexCoordinate); " +
"}";
Init GL
public static void initGL() {
// initialize vertex byte buffer for shape coordinates
ByteBuffer bb = ByteBuffer.allocateDirect(SQUARE_COORDINATES.length * 4);
bb.order(ByteOrder.nativeOrder());
_vertexBuffer = bb.asFloatBuffer();
_vertexBuffer.put(SQUARE_COORDINATES);
_vertexBuffer.position(0);
// initialize texture byte buffer for texture coordinates
bb = ByteBuffer.allocateDirect(TEXTURE_COORDINATES.length * 4);
bb.order(ByteOrder.nativeOrder());
_textureBuffer = bb.asFloatBuffer();
_textureBuffer.put(TEXTURE_COORDINATES);
_textureBuffer.position(0);
// initialize byte buffer for the draw list
ByteBuffer dlb = ByteBuffer.allocateDirect(DRAW_ORDER.length * 2);
dlb.order(ByteOrder.nativeOrder());
_drawListBuffer = dlb.asShortBuffer();
_drawListBuffer.put(DRAW_ORDER);
_drawListBuffer.position(0);
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,VERTEX_SHADER_CODE);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,FRAGMENT_SHADER_CODE);
_programHandle = GLES20.glCreateProgram(); // create empty OpenGL Program
GLES20.glAttachShader(_programHandle,vertexShader); // add the vertex shader to program
GLES20.glAttachShader(_programHandle,fragmentShader); // add the fragment shader to program
GLES20.glBindAttribLocation(_programHandle,TEXTURE_COORDINATE_ParaM);
GLES20.glLinkProgram(_programHandle);
positionHandle = GLES20.glGetAttribLocation(_programHandle,POSITION_ParaM);
textureCoordinateHandle = GLES20.glGetAttribLocation(_programHandle,TEXTURE_COORDINATE_ParaM);
mvpMatrixHandle = GLES20.glGetUniformlocation(_programHandle,MVPMATRIX_ParaM);
绘图功能(loadGLTexture方法获得90x60尺寸的位图)
protected int loadGLTexture(Bitmap bitmap)
{
Integer cachedTextureId = bitmapToTextureMap.get(bitmap.hashCode());
if (cachedTextureId != null)
{
return cachedTextureId;
}
imageRatio = bitmap.getWidth() / ((float) bitmap.getHeight());
// generate one texture pointer and bind it to our handle
int[] textureHandle = new int[1];
GLES20.glGenTextures(1,textureHandle,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureHandle[0]);
// create nearest filtered texture
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);
// Use Android glutils to specify a two-dimensional texture image from our bitmap
glutils.texImage2D(GLES20.GL_TEXTURE_2D,GLES20.GL_RGBA,bitmap,0);
bitmapToTextureMap.put(bitmap.hashCode(),textureHandle[0]);
bitmap.recycle();
return textureHandle[0];
}
public void draw (Point viewPos)
{
// float[] curPos = pos.plus(viewPos).plus(origin).toglratio();
// float[] curPos = pos.plus(origin).toglratio();
float[] curPos = origin.toglratio();
float[] scratchmatrix = new float[16];;
System.arraycopy(GLState._MVPMatrix,scratchmatrix,16);
// Add program to OpenGL environment
GLES20.gluseProgram(GLState._programHandle);
// Enable a handle to the vertices
GLES20.glEnabLevertexAttribArray(GLState.positionHandle);
// Prepare the coordinate data
GLES20.glVertexAttribPointer(GLState.positionHandle,GLState.COORDS_PER_VERTEX,GLES20.GL_FLOAT,false,GLState.VERTEX_STRIDE,GLState._vertexBuffer);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,_textureDataHandle);
GLState._textureBuffer.position(0);
GLES20.glEnabLevertexAttribArray(GLState.textureCoordinateHandle);
GLES20.glVertexAttribPointer(GLState.textureCoordinateHandle,2,GLState._textureBuffer);
// translate the sprite to it's current position
// Matrix.translateM(scratchmatrix,curPos.x,curPos.y,0.1f);
Matrix.translateM(scratchmatrix,curPos[0],curPos[1],1f);
// rotate the sprite
Matrix.rotateM(scratchmatrix,_rotationZ,1.0f);
// scale the sprite
Matrix.scaleM(scratchmatrix,scale[0],scale[1],1);
// Apply the projection and view transformation
GLES20.gluniformMatrix4fv(GLState.mvpMatrixHandle,1,0);
// Draw the sprite
GLES20.glDrawElements(GLES20.GL_TRIANGLES,GLState.DRAW_ORDER.length,GLES20.GL_UNSIGNED_SHORT,GLState._drawListBuffer);
// disable vertex array
GLES20.gldisabLevertexAttribArray(GLState.positionHandle);
GLES20.gldisabLevertexAttribArray(GLState.textureCoordinateHandle);
}
任何帮助将不胜感激,我正在看书,但它也在其中的示例中发生,并且找不到解决该问题的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)