当前位置: 首页 > 知识库问答 >
问题:

在opengl ES2.0中以全屏居中和正确的比例渲染纹理

林国安
2023-03-14

我正在加载一个位图到渲染器类中,我想用正确的比例和尽可能大的比例来渲染屏幕中心的纹理

顶点和纹理数据:

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,//TexCoord 2 1f,1f,0.0f,//位置3 1.0 f,0.0f//TexCoord 3};

private final short[] mIndicesData =
{ 
        0, 1, 2, 0, 2, 3 
};

和绘制方法:

public void onDrawFrame(GL10 glUnused){

    // Set the viewport
    GLES20.glViewport(0, 0, bitmap.width, bitmap.height);

    // Clear the color buffer
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    // Use the program object
    GLES20.glUseProgram(mProgramObject);

    // Load the vertex position
    mVertices.position(0);
    GLES20.glVertexAttribPointer ( mPositionLoc, 3, GLES20.GL_FLOAT, 
                                   false, 
                                   5 * 4, mVertices );
    // Load the texture coordinate
    mVertices.position(3);
    GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
                                   false, 
                                   5 * 4, 
                                   mVertices );

    GLES20.glEnableVertexAttribArray ( mPositionLoc );
    GLES20.glEnableVertexAttribArray ( mTexCoordLoc );

    // Bind the texture
    GLES20.glActiveTexture ( GLES20.GL_TEXTURE0 );
    GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, mTextureId );

    // Set the sampler texture unit to 0
    GLES20.glUniform1i ( mSamplerLoc, 0 );

    GLES20.glDrawElements ( GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndices );
}

现在我用位图尺寸设置视口(不工作)。我应该如何计算纹理的视口尺寸来适应屏幕保持比例?

谢谢你。

共有1个答案

咸正平
2023-03-14

可能您应该使用ModelViewPrjoection矩阵。查看此源代码http://code.google.com/p/android-opengles-samples-for-vikulov-blogspot-com/source/browse/trunk/opengltemplate/src/com/vikulov/opengl/myglrenderer.java

 类似资料:
  • 我如何渲染纹理让假设宽度=400,高度=800,在这个比例? 这是我的代码:

  • 通过Three.js发开Web3D应用的时候,渲染窗口可能是全屏效果占满web页面整个body区域,也可能是web页面上一个特定位置特定区域,比如渲染区域是一个特定位置、特定宽高的div元素所在区域。 全屏渲染 直接通过Three.js的WebGL渲染器WebGLRenderer的.setSize()方法设置渲染尺寸为浏览器body区域宽高度。 var width = window.innerWi

  • 渲染纹理是一张在 GPU 上的纹理。通常我们会把它设置到相机的 目标纹理 上,使相机照射的内容通过离屏的 frambuffer 绘制到该纹理上。一般可用于制作汽车后视镜,动态阴影等功能。 使用 RenderTexture // 方法一:把 3D 相机照射的内容绘制到 UI 的精灵帧上 export class CaptureToWeb extends Component { @proper

  • 当我在基于pygame的游戏中使用精灵时,它们似乎不能正常工作——正如你在屏幕截图上看到的那样,它们的形状不正确,并且上部有一些奇怪的变形。 黑色方块顶部有变形;中间的精灵一定是箭头形状的东西。 加载图像时涉及的一段代码(从pygame的教程中复制粘贴): 我在MacOSX上的Python2.7.11和3.4.2上做了我的项目,发现了这个问题。但当我在Windows上的Python3.1上测试它时

  • 我使用OpenGL 3.2来渲染阴影贴图。为此,我构造了一个渲染深度纹理的帧缓冲区。 要将纹理附加到帧缓冲区,我使用: 这很有效。渲染灯光视图后,我的GLSL着色器可以对深度纹理进行采样,以解决灯光的可见性问题。 我现在试图解决的问题是有更多的阴影贴图,比如说50个。在我的主要渲染过程中,我不想从50个不同的纹理中采样。我可以使用图集,但我想知道:我可以将所有这些阴影贴图作为2D纹理数组的切片传递

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位