Opengl es android中的Opengl GLES20.GL_夹紧到边缘

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,

使用以下选项将纹理渲染为矩形(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.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_夹紧至边缘);