我如何渲染纹理让假设宽度=400,高度=800,在这个比例?
这是我的代码:
@Override
public void onDrawFrame(GL10 glUnused) {
GLES20.glClearColor(0.9f, 0.9f, 0.9f, .5f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc( GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
Matrix.setIdentityM(mMMatrix, 0);
Matrix.rotateM(mMMatrix, 0, 270.0f, 0, 0, 1);
Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
GLES20.glUseProgram(programTextured);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
sqTex.getVertexBuffer().position(sqTex.VERT_OFFSET);
GLES20.glVertexAttribPointer(
GLES20.glGetAttribLocation(programTextured, "aPosition"), 3,
GLES20.GL_FLOAT, false, 5 * 4, sqTex.getVertexBuffer());
GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(programTextured, "aPosition"));
sqTex.getVertexBuffer().position(sqTex.TEXT_OFFSET);
GLES20.glVertexAttribPointer(
GLES20.glGetAttribLocation(programTextured, "aTextureCoord"), 2,
GLES20.GL_FLOAT, false, 5 * 4, sqTex.getVertexBuffer());
GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(programTextured, "aTextureCoord"));
GLES20.glUniformMatrix4fv(
GLES20.glGetUniformLocation(programTextured, "uMVPMatrix"), 1, false,
mMVPMatrix, 0);
GLES20.glVertexAttrib4f(
GLES20.glGetAttribLocation(programTextured, "acolor"),
.6f,0.3f,0.9f,.5f);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, sqTex.getIndexBuffer());
GLES20.glDisableVertexAttribArray(GLES20.glGetAttribLocation(programTextured, "aTextureCoord"));
}
@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
//flaot ratio2 = (float)height /
//Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3f, 17);
Matrix.frustumM(mProjMatrix, 0, -1, 1, -1, 1, 3, 17);
}
int mTextureID;
@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
program = createProgram(mVertexShader, mFragmentShader);
programTextured = createProgram(mVertexShaderTextured, mFragmentShaderTextured);
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureID = textures[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
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);
InputStream is = mContext.getResources()
.openRawResource(R.drawable.image0003);
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(is);
} finally {
try {
is.close();
} catch(IOException e) {
// Ignore.
}
}
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
}
我会离开圆台而使用刻度:
您需要两个因子,首先是screenratio=screenwidt/screenheight
,然后是imageratio=imagewidt/imageheight
。
现在,如果imageratio
if (imageWidth>imageHeight) scaleM(mMMatrix, 1/(imageWidth/imageHeight), 1, 1)
else scaleM(mMMatrix, 1/(imageHeight/imageWidth), 1, 1)
if (imageHeight>imageWidth) scaleM(mMMatrix, 1, 1/(imageHeight/imageWidth), 1)
else scaleM(mMMatrix, 1, 1/(imageWidth/imageHeight), 1)
我正在加载一个位图到渲染器类中,我想用正确的比例和尽可能大的比例来渲染屏幕中心的纹理 顶点和纹理数据: private final float[]mVerticesData={-1f,1f,0.0f,//位置0.0.0f,0.0f,//TexCoord 0-1f,-1f,0.0f,//位置1.0.0f,1.0f,//TexCoord 1 1f,-1f,0.0f,//位置2 1.0 f,1.0 f,
我正在尝试在OpenGL/LWJGL中制作一个简单的按钮, 我可以正确地渲染我的2D四边形,但是当我实现纹理时,整个四边形只有大约3/4的部分得到了纹理,就像这样:https://dl.dropboxusercontent.com/u/60223805/glerror1.png 如果我删除纹理坐标,我得到这个:https://dl.dropboxusercontent.com/u/60223805
我正在绘制一个纹理四边形,但使用的纹理是以前绑定的纹理,即使我试图绑定一个新纹理。 在GuiHandler中创建纹理。Java语言 渲染代码 有人知道为什么使用先前绑定的纹理而不是正确的纹理吗?P、 我正在使用LWJGL
更新1 如您所见,在FrameBuffer上绘制的LibGDX纹理,与直接在SpriteBatcher上绘制的纹理相比,在SpriteBatcher上绘制的纹理要比原始纹理暗一些。 左侧为原图,比手机1080x1920屏幕小50%。 右侧部分是先在FrameBuffer上绘制的TextureRegion,然后在SpriteBatch上绘制,如下代码所示: 如你所见,它比直接从纹理绘制的图像暗一点。
设置:OpenGL ES 1.0,Android 术语背景图像在这里是指一个全屏纹理,绘制在两个三角形上,这两个三角形使全屏变成矩形。 如果我绘制完整的场景,包括背景图像,我得到黑色背景颜色而不是清晰的彩色背景,我看不到我的背景纹理显示 实现:
我有一个加载图像滚动窗格。我将这个图像与她的自然大小,如果这个图像太大,我将不会激活滚动条,但这个指令 用于放置在滚动窗格中的缩放图像。我能做什么? 类GUI: 类映射: