我试图应用一个大的图像的一部分,以矩形在OpenGL ES 2.0
我有这个大的纹理表或精灵表。每个图像都是32 x32。完整图像是192 x32。
加载纹理
glGenTextures(1, &texture->textureId);
bindTexture(texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
stbi_set_flip_vertically_on_load(true);
unsigned char* textureData = stbi_load(texturePath, &texture->width, &texture->height, &texture->channels, 0);
if(textureData)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->width, texture->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);
}
else
{
log_error("Couldn't load texture: %s", texturePath);
}
stbi_image_free(textureData);
所以,为了从这个精灵表中获得第一个精灵,我使用((1*32)/192)并获得这些纹理坐标
static Vertex vertices[4] =
{
// Position Color Tex Coords
{{{1.0f, 1.0f, 0.0f}}, {{1.0f, 1.0f, 0.0f, 1.0f}}, {{0.16f, 1.0f}}},
{{{1.0f, -1.0f, 0.0f}}, {{1.0f, 1.0f, 0.0f, 1.0f}}, {{0.16, 0.0f}}},
{{{-1.0f, -1.0f, 0.0f}}, {{1.0f, 1.0f, 0.0f, 1.0f}}, {{0.0f, 0.0f}}},
{{{-1.0f, 1.0f, 0.0f}}, {{1.0f, 1.0f, 0.0f, 1.0f}}, {{0.0f, 1.0f}}},
};
片段着色器
#version 100
precision mediump float;
varying vec4 fColor;
varying vec2 fTexCoord;
uniform sampler2D textureSampler;
void main()
{
gl_FragColor = texture2D(textureSampler, fTexCoord);
}
但我没有得到预期的输出。相反,它会将整个精灵表单应用到矩形
上
为什么会这样?我该怎么解决这个问题?
1条答案
按热度按时间bprjcwpo1#
顶点的纹理坐标似乎已关闭。由于每个精灵的高度是32像素,整个图像的高度也是32像素,所以您将使用1。0为高度。我猜你的纹理坐标的x分量似乎是正确的tho。
我在一个小游戏中使用了类似的方法,顶点看起来像这样:
m_spriteCount
是我的纹理中的图像计数(在你的例子中是6),m_spritePos
是我渲染的当前纹理位置(从0到5)。我不使用任何数据的颜色,因为纹理已经包含的颜色(显然),我不想混合一些颜色,但只渲染纹理colores。