gpt4 book ai didi

ios - 如何修改默认的 iOS OpenGL ES 2.0 模板以显示纹理?

转载 作者:行者123 更新时间:2023-11-28 23:12:19 24 4
gpt4 key购买 nike

我正在尝试学习一些用于 iPhone 开发的基本 OpenGL ES,但我有一项任务无法完成。

我似乎无法更改默认的 OpenGL ES 模板以在弹跳方 block 上显示纹理而不是默认的类似彩虹的效果。我正在尝试为这个正方形使用纹理,但到目前为止正方形只显示黑色。在这个简单的案例中我可能做错了什么,我该如何修改基本模板代码来显示我的纹理?

最佳答案

作为旁注,默认的 OpenGL ES 模板似乎已经针对 iOS 5.0 SDK 进行了更改,现在使用 GLKit 绘制旋转立方体,因此我无法基于他们提供的原始彩虹方 block 创建一个简单的测试项目一直在用。

相反,您可能想查看 sample application我为这门课准备了类(class)。这是一个相当精简的应用程序,可以显示旋转立方体表面的纹理。我在 video for that class on iTunes U 中详细描述了这是如何工作的.

此示例应用程序使用 Apple 的 PVRTexture 类(来自他们的其他示例应用程序之一)加载 PVRTC 压缩纹理文件(比普通图像更节省内存)。设置纹理的核心代码是这样的:

glGenTextures(1, &_name);
glBindTexture(GL_TEXTURE_2D, _name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glCompressedTexImage2D(GL_TEXTURE_2D, i, _internalFormat, width, height, 0, [data length], [data bytes]);

其中 _name 是您稍后将用于绑定(bind)该纹理的标识符。如果您使用的是正常的未压缩纹理,则可以使用 glTexImage2D() 而不是最后一个函数。

然后您可以启用纹理的使用:

glEnable(GL_TEXTURE_2D);

并绑定(bind)要显示的纹理,使用创建纹理时获得的标识符:

glBindTexture(GL_TEXTURE_2D, pvrTexture.name);

默认情况下,此纹理绑定(bind)到纹理单元 0,但您可以使用 glActiveTexture(GL_TEXTURE1) 等切换到另一个单元。

然后你需要将这个纹理作为统一传递给你的着色器程序,第二个参数是纹理绑定(bind)到的纹理单元:

glUniform1i(uniforms[UNIFORM_TEXTURE], 0);

您还需要为您的顶点设置相应的纹理位置,以便您的纹理以正确的方式映射到您的表面:

const GLfloat cubeTexCoords[] = {
1.0, 0.0,
0.0, 0.0,
1.0, 1.0,
0.0, 1.0,
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.0, 1.0,
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
1.0, 1.0,
};

这些坐标将作为属性输入到您的着色器程序中:

glVertexAttribPointer(ATTRIB_TEXTUREPOSITION, 2, GL_FLOAT, 0, 0, cubeTexCoords);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITION);

您的着色器程序将需要能够接收纹理统一及其坐标,因此您的顶点着色器中将具有如下所示的内容:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

uniform mat4 modelViewProjMatrix;

void main()
{
gl_Position = modelViewProjMatrix * position;
textureCoordinate = inputTextureCoordinate.xy;
}

这是一个匹配的片段着色器:

varying highp vec2 textureCoordinate;

uniform sampler2D texture;

void main()
{
gl_FragColor = texture2D(texture, textureCoordinate);
}

您可以看到着色器程序如何获取纹理坐标并将它们传递给片段着色器,在片段着色器中对纹理进行采样并用于在该片段上生成最终颜色。

编译此着色器时需要匹配属性和制服,但 OpenGL ES 2.0 模板应说明如何执行此操作。

虽然我没有提供在 OpenGL ES 2.0 模板上启用纹理显示的确切代码,但您应该能够使用上面的代码作为执行此操作的基础。

关于ios - 如何修改默认的 iOS OpenGL ES 2.0 模板以显示纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com