Android:Q纹理坐标上的OpenGL ES 1.1没有任何效果

Android:Q纹理坐标上的OpenGL ES 1.1没有任何效果,android,opengl-es,texture-mapping,opengl-es-1.1,Android,Opengl Es,Texture Mapping,Opengl Es 1.1,我正在为Android开发一个OpenGLES1.1应用程序(通过NDK调用C代码进行OpenGL调用) 我的问题是,我试图使用Q纹理坐标以及通常的(S,T)纹理坐标。然而,我在Q中投入的任何东西都没有任何明显的效果 (旁白:想要玩Q坐标的原因是我想将矩形纹理映射到空间中具有正确透视效果的梯形四边形(即不仿射)——如中所述) 我尝试设置Q坐标(不是默认的1.0f)的方法是通常的:我提供4个纹理坐标,而不是通常的2个。我尝试过把各种各样的值放在Q坐标中(甚至放在典型的未使用的R坐标中,以防两者混淆

我正在为Android开发一个OpenGLES1.1应用程序(通过NDK调用C代码进行OpenGL调用)

我的问题是,我试图使用Q纹理坐标以及通常的(S,T)纹理坐标。然而,我在Q中投入的任何东西都没有任何明显的效果

(旁白:想要玩Q坐标的原因是我想将矩形纹理映射到空间中具有正确透视效果的梯形四边形(即不仿射)——如中所述)

我尝试设置Q坐标(不是默认的1.0f)的方法是通常的:我提供4个纹理坐标,而不是通常的2个。我尝试过把各种各样的值放在Q坐标中(甚至放在典型的未使用的R坐标中,以防两者混淆),对我的纹理没有明显的影响。我希望看到Q!=1.0——例如,每个纹理坐标的Q=0.5应该只是每个导出(S,T)值的两倍——实际上,将表观纹理大小减半。但是没有变化

我无法发布完整的代码,但以下是基本原理:

我的顶点结构定义如下:

typedef struct
{
    GLfloat x, y, z;        // 3 x spacial coord - 12 bytes
    GLfloat tx, ty, tr, tq; // 4 x texture coord - 16 bytes
    GLfloat padding[1];     // make it up to 32 bytes (or 8 floats, in effect)
} VertexData;
创建每个顶点缓冲区对象(VBO):

下面是我如何给出顶点和文本坐标指针:

glVertexPointer(3, GL_FLOAT, stride, (GLvoid*)((char*)NULL));

// note the 4 below - we want to give 4 tex coordinates, not 2.
// 3*4 corresponds to the offset of texture coords in the VertexData struct
glTexCoordPointer(4, GL_FLOAT, 32 /*stride*/,  (GLvoid*)((char*)NULL + 3*4));
这一切都运行得很好,但正如我所说,我的Q坐标没有任何区别。如果将my
glTextCoordPointer
调用更改为仅提供2或3个坐标,则程序行为没有任何变化:

glTexCoordPointer(2, GL_FLOAT, 32 /*stride*/,  (GLvoid*)((char*)NULL + 3*4));
// OR:
glTexCoordPointer(3, GL_FLOAT, 32 /*stride*/,  (GLvoid*)((char*)NULL + 3*4));
我的问题是:为什么我的Q纹理坐标没有任何影响?如果它是特定于设备或Android API级别的,我可以了解它在哪些设备或API级别上工作吗?如果我不能依靠Q坐标做任何有用的事情,我怎么能达到同样的效果(真实的、非仿射的梯形纹理贴图)?

我正在实际的Android设备上测试我的代码:HTC Wildfire S

为了方便起见,我正在使用加载纹理

更新

我已经下载了。这使用Java OpenGL ES接口(无NDK)。我添加了随机的R和Q纹理坐标,再一次,没有可见的效果

更新2

我放弃了尝试获得Q纹理坐标以产生任何效果;我想这并不是所有设备都支持的。对此仍感兴趣的权威信息

相关链接:


这不是对您的问题的确切答案,但您可能需要检查的内容很少:

  • 你的纹理有两个高度和宽度的力量吗
  • R坐标应始终为0.f,因为它用于3d纹理
  • 为什么不在glTexCoordPointer和glVertexPointer中传递数据?乙二醇

尝试在其他Android设备或平台上运行你的应用程序

这并不是对你问题的确切答案,但你可能需要检查以下几点:

  • 你的纹理有两个高度和宽度的力量吗
  • R坐标应始终为0.f,因为它用于3d纹理
  • 为什么不在glTexCoordPointer和glVertexPointer中传递数据?乙二醇

尝试在其他Android设备或平台上运行你的应用程序

我同意你的看法。一些android设备不支持OpenGL ES 1.1中的纹理q坐标

根据我的经验,Galaxy S、S2、S3工作正常。 Galaxy注意,Galaxy S2 HD没有。(可能是GPU问题??)

但是OpenGLES2.0中的纹理q坐标在那些有问题的设备上工作

下面是我的着色器代码

private final String mVertexShader =
    "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec4 aTextureCoord;\n" +
        "varying vec4 vTextureCoord;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vTextureCoord = aTextureCoord;\n" +
        "}\n";

private final String mFragmentShader =
    "precision mediump float;\n" +
        "varying vec4 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "void main() {\n" +
        "  gl_FragColor = texture2DProj(sTexture, vTextureCoord);\n" +
        "}\n";
所以我决定在支持2.0的设备上使用OpenGL 2.0,在其他设备上使用OpenGL 1.0

我发布了这个应用程序,完成了大约200万次下载,还没有听到任何与渲染相关的投诉


希望这能有所帮助。

我同意你的看法。一些android设备不支持OpenGL ES 1.1中的纹理q坐标

根据我的经验,Galaxy S、S2、S3工作正常。 Galaxy注意,Galaxy S2 HD没有。(可能是GPU问题??)

但是OpenGLES2.0中的纹理q坐标在那些有问题的设备上工作

下面是我的着色器代码

private final String mVertexShader =
    "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec4 aTextureCoord;\n" +
        "varying vec4 vTextureCoord;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vTextureCoord = aTextureCoord;\n" +
        "}\n";

private final String mFragmentShader =
    "precision mediump float;\n" +
        "varying vec4 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "void main() {\n" +
        "  gl_FragColor = texture2DProj(sTexture, vTextureCoord);\n" +
        "}\n";
所以我决定在支持2.0的设备上使用OpenGL 2.0,在其他设备上使用OpenGL 1.0

我发布了这个应用程序,完成了大约200万次下载,还没有听到任何与渲染相关的投诉


希望能有所帮助。

您的示例是否适用于某些平台/操作系统?你有没有试过在Mac/Win/Linux上使用OpenGLES二进制文件?嗨,rockeye,还没有试过,但它确实在我的待办事项清单上(现在没有时间)。我当然有其他人用Q坐标做事情并获得效果的例子。
glHint(GL\u PERSPECTIVE\u CORRECTION\u HINT,GL\u NICEST)
改变了什么吗?嗨,genpfault,恐怕没有——这是我已经尝试过的事情之一。你的示例在某些平台/操作系统上有效吗?你有没有试过在Mac/Win/Linux上使用OpenGLES二进制文件?嗨,rockeye,还没有试过,但它确实在我的待办事项清单上(现在没有时间)。我当然有其他人用Q坐标做事情并获得效果的例子。glHint(GL_透视图\校正\提示,GL_最好)改变了什么吗?嗨,詹普福,恐怕没有——这是我已经尝试过的事情之一。嗨,洛克耶。是的,两个高度和宽度的幂(512 x 512)。R坐标开始时是0.0,所以我尝试过——但最后我也在那里输入了其他值,以防我的理解或R和Q的顺序被切换——只是为了看看我是否能以任何方式影响渲染的内容(我不能)。我已经在使用glTextCoordPointer和glVertexPointer传递数据了——事实上,您的代码示例实际上是我发布的代码的引用。不,仔细看,我的代码示例的最后一个参数是vertexData,而不是NULL(与您的代码示例一样)。但我猜你是在用另一种方式指定你的数据?啊,对不起,求你了
private final String mVertexShader =
    "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec4 aTextureCoord;\n" +
        "varying vec4 vTextureCoord;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vTextureCoord = aTextureCoord;\n" +
        "}\n";

private final String mFragmentShader =
    "precision mediump float;\n" +
        "varying vec4 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "void main() {\n" +
        "  gl_FragColor = texture2DProj(sTexture, vTextureCoord);\n" +
        "}\n";