C语言 纹理坐标在OpenGL ES 2中不能正常工作.0

cyvaqqii  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(95)

我试图应用一个大的图像的一部分,以矩形在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);
}

但我没有得到预期的输出。相反,它会将整个精灵表单应用到矩形


为什么会这样?我该怎么解决这个问题?

bprjcwpo

bprjcwpo1#

顶点的纹理坐标似乎已关闭。由于每个精灵的高度是32像素,整个图像的高度也是32像素,所以您将使用1。0为高度。我猜你的纹理坐标的x分量似乎是正确的tho。
我在一个小游戏中使用了类似的方法,顶点看起来像这样:

float width = 1.0f / (float)m_spriteCount;
    float widthMin = m_spritePos * width;
    float widthMax = (m_spritePos + 1) * width;

    m_vertices = {
        //                x,                   y,          z,       w,    h
        size.x + position.x, size.y + position.y, position.z, widthMax, 1.0f,       // top right
        size.x + position.x,          position.y, position.z, widthMax, 0.0f,       // bottom right
                 position.x,          position.y, position.z, widthMin, 0.0f,       // bottom left
                 position.x, size.y + position.y, position.z, widthMin, 1.0f        // top left
    };

m_spriteCount是我的纹理中的图像计数(在你的例子中是6),m_spritePos是我渲染的当前纹理位置(从0到5)。
我不使用任何数据的颜色,因为纹理已经包含的颜色(显然),我不想混合一些颜色,但只渲染纹理colores。

相关问题