Opengl es android中的Opengl GLES20.GL_夹紧到边缘
使用以下选项将纹理渲染为矩形(2个三角形): 没问题。但我不希望纹理被拉伸,因此我尝试更改为:Opengl es android中的Opengl GLES20.GL_夹紧到边缘,opengl-es,Opengl Es,使用以下选项将纹理渲染为矩形(2个三角形): 没问题。但我不希望纹理被拉伸,因此我尝试更改为: GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
但我得到的只是一个黑屏
有没有简单的方法来避免纹理与屏幕匹配,从而保持比例
这是我加载纹理的地方
public static int loadTexture(final Context context, Bitmap bitmap)
{
final int[] textureHandle = new int[1];
GLES20.glGenTextures(1, textureHandle, 0);
if (textureHandle[0] != 0)
{
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; // No pre-scaling
// Read in the resource
//final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);
// Bind to the texture in OpenGL
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
// Set filtering
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
// Load the bitmap into the bound texture.
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// Recycle the bitmap, since its data has been loaded into OpenGL.
bitmap.recycle();
}
if (textureHandle[0] == 0)
{
throw new RuntimeException("Error loading texture.");
}
return textureHandle[0];
}
以下是一些渲染器代码:
public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
{
String vShaderStr = RawResourceReader.readTextFileFromRawResource(this.context, R.raw.bulge_vertex_shader);
String fShaderStr = RawResourceReader.readTextFileFromRawResource(this.context, R.raw.bulge_fragment_shader);
// Load the shaders and get a linked program object
mProgramObject = ESShader.loadProgram(vShaderStr, fShaderStr);
// Get the attribute locations
mPositionLoc = GLES20.glGetAttribLocation(mProgramObject, "a_position");
mTexCoordLoc = GLES20.glGetAttribLocation(mProgramObject, "a_texCoord" );
centerUniformLoc = GLES20.glGetUniformLocation(mProgramObject, "center");
radiusUniformLoc = GLES20.glGetUniformLocation(mProgramObject, "radius");
scaleUniformLoc = GLES20.glGetUniformLocation(mProgramObject, "scale");
Bitmap b = ((theApplication)context.getApplicationContext()).getBitmap();
mTextureId = TextureHelper.loadTexture(this.context, b);
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}
// /
// Draw a triangle using the shader pair created in onSurfaceCreated()
//
public void onDrawFrame(GL10 glUnused)
{
//distance += 0.01;
// Set the viewport
GLES20.glViewport(0, 0, mWidth, mHeight);
// 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 );
GLES20.glUniform2f(centerUniformLoc, mCenterData[0], mCenterData[1]);
GLES20.glUniform1f(radiusUniformLoc, radius);
GLES20.glUniform1f(scaleUniformLoc, scale);
// Set the color matrix uniform unit to 1
GLES20.glDrawElements ( GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndices );
}
以及具有纹理坐标的四边形顶点
private final float[] mVerticesData =
{
-1f, 1f, 0.0f, // Position 0
0.0f, 0.0f, // TexCoord 0
-1f, -1f, 0.0f, // Position 1
0.0f, 1.0f, // TexCoord 1
1f, -1f, 0.0f, // Position 2
1.0f, 1.0f, // TexCoord 2
1f, 1f, 0.0f, // Position 3
1.0f, 0.0f // TexCoord 3
};
private final short[] mIndicesData =
{
0, 1, 2, 0, 2, 3
};
我只想看到纹理缩放到屏幕大小,但保持纵横比,这样它就不会被拉伸
谢谢为了避免这个黑屏问题,您需要将这四行合并,而不是将前两行替换为后两行。在代码中,您正在替换
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_NEAREST);
与
原来我也这么做了,;然而,纠正措施应该是增加夹紧线,而不是更换过滤线。工作代码是一个组合:
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
为了避免这个黑屏问题,您需要合并这四行,而不是用后两行替换前两行。在代码中,您正在替换
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_NEAREST);
与
原来我也这么做了,;然而,纠正措施应该是增加夹紧线,而不是更换过滤线。工作代码是一个组合:
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
你可以发布完整的纹理创建和初始化片段,让你黑屏吗?你的描述有点模棱两可。你意识到在你发布的代码中没有夹钳到边缘的线吗?请发布显示错误的实际代码。如果这听起来很琐碎,我很抱歉,但我想知道你是在用钳夹到边缘替换min/mag过滤线,还是在另外添加钳夹到边缘。蒂姆,也许我解释得不够清楚,或者你只是没有读文章的开头。在乞讨会上,我写了两行行行得通的和两行行不通的。我在这里再次写下黑屏的线条(int loadTexture方法):GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);GLES20.glTexParameteri(GLES20.GL_纹理2D、GLES20.GL_纹理包裹、GLES20.GL_夹紧至边缘);你可以发布完整的纹理创建和初始化片段,让你黑屏吗?你的描述有点模棱两可。你意识到在你发布的代码中没有夹钳到边缘的线吗?请发布显示错误的实际代码。如果这听起来很琐碎,我很抱歉,但我想知道你是在用钳夹到边缘替换min/mag过滤线,还是在另外添加钳夹到边缘。蒂姆,也许我解释得不够清楚,或者你只是没有读文章的开头。在乞讨会上,我写了两行行行得通的和两行行不通的。我在这里再次写下黑屏的线条(int loadTexture方法):GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);GLES20.glTexParameteri(GLES20.GL_纹理2D、GLES20.GL_纹理包裹、GLES20.GL_夹紧至边缘);