如何使用OpenGl用自定义纹理填充山丘?

时间:2014-06-24 05:21:55

标签: opengl-es opengl-es-2.0

我正在尝试学习OpenGl阅读各种教程,所以我看着http://www.raywenderlich.com/32954/how-to-create-a-game-like-tiny-wings-with-cocos2d-2-x-part-1

在该教程中,他基本上采用条纹纹理:

Rectangular texture with stripes

将它包裹在山上,看起来像:

Hills with stripes

她通过获取山顶的坐标并创建三角形条来创建顶点和纹理坐标

    _hillVertices[_nHillVertices] = CGPointMake(pt0.x, 0 + minY);
    _hillTexCoords[_nHillVertices++] = CGPointMake(pt0.x/512, 1.0f);
    _hillVertices[_nHillVertices] = CGPointMake(pt1.x, 0 + minY);
    _hillTexCoords[_nHillVertices++] = CGPointMake(pt1.x/512, 1.0f);

    _hillVertices[_nHillVertices] = CGPointMake(pt0.x, pt0.y);
    _hillTexCoords[_nHillVertices++] = CGPointMake(pt0.x/512, 0);
    _hillVertices[_nHillVertices] = CGPointMake(pt1.x, pt1.y);
    _hillTexCoords[_nHillVertices++] = CGPointMake(pt1.x/512, 0);

我的问题是,如果我的条纹具有相同的纹理,但是想要将它渲染到山上而不会失真怎么办?您将从山图中注意到,纹理有点缠绕在山丘上(因此所有条纹都是弯曲的),但是如何应用纹理以使其与原始图像完全相同?

我正在使用OpenGl-es 2.0。

EDIT。

我尝试将纹理坐标设置为与顶点坐标相同,但它并没有像我希望的那样完成:

My texture

enter image description here

第一张图片显示纹理。第二个图像是应用于山丘时的效果。条纹不再是“波浪状”,但它们看起来比原始纹理大得多,而且看起来方向错误。我该如何纠正?我的修改后的代码是

    _hillTexCoords[tcc++]=CGPointMake(p0.x/512, 0+_minY);
    _hillTexCoords[tcc++]=CGPointMake(p0.x/512, p0.y/512);

1 个答案:

答案 0 :(得分:1)

要在3D中执行此操作,您必须了解您要求的是获取模型(山丘)的2D屏幕投影并在该投影上应用纹理。

最强大的方法是创建一个模板缓冲区并将山丘绘制到它上面。然后使用该模板缓冲区绘制全屏纹理四边形,以便仅在模板为TRUE(山丘可见)的情况下绘制四边形。

几乎可以使用alpha通道完成相同的操作。使用颜色蒙版仅将山形绘制到Alpha通道,然后使用混合绘制全屏纹理四边形,其中alpha为1。

如果您可以访问着色器,则可以使用片段着色器获取每个片段的相对屏幕坐标,使左上角为(0,0),右下角为(1,1),然后使用这些坐标获取图像纹素而不是使用模型中的纹理坐标。