首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL纹理加工

OpenGL纹理加工
EN

Stack Overflow用户
提问于 2021-12-18 21:01:07
回答 1查看 90关注 0票数 0

我已经为2D实现了一个简单的批处理呈现设置。它似乎是有效的,除了一些工件看起来像Z-战斗在一个单一的表面。

博士?我录制了录象,演示了我所看到的以及什么“修复”了它。

有三种纹理:

  • 大小为1x1的纯白色纹理
  • 一种长满草的地砖“背景”纹理
  • 一个简单的木箱

一些四角体只有纹理,有些只有平色调,还有一些是纹理和着色的。

这是顶点着色器:

代码语言:javascript
复制
#version 460 core

layout(location = 0) in vec3  _position;
layout(location = 1) in vec4  _color;
layout(location = 2) in vec2  _texture_coords;
layout(location = 3) in int   _texture_index;
layout(location = 4) in float _tiling_factor;

uniform mat4 viewproj_matrix;

out vec4     color;
out vec2     texture_coords;
out flat int texture_index;
out float    tiling_factor;

void main()
{
    color          = _color;
    texture_coords = _texture_coords;
    texture_index  = _texture_index;
    tiling_factor  = _tiling_factor;
    
    gl_Position = viewproj_matrix * vec4(_position, 1.0);
}

碎片着色器:

代码语言:javascript
复制
#version 460 core

layout(location = 0) out vec4 final_color;

in vec4     color;
in vec2     texture_coords;
in flat int texture_index;
in float    tiling_factor;

uniform sampler2D textures[32];

void main()
{
    final_color = (
        texture(textures[texture_index], texture_coords * tiling_factor) * color
    );
}

当然,这很简单。但我也是新手,所以简单是好的。这种行为似乎与取样多个纹理有关。我这么说是因为,正如我在视频中所演示的,如果我只对三个绑定纹理中的一个进行采样,工件就会消失。当我强迫批次大小为一个四分之一时,这种情况也会自行解决。

下面是绘制平面阴影四边形的代码:

代码语言:javascript
复制
void Renderer2D::draw_quad(const RenderAPI &api, const glm::vec3 &position,
                        const glm::vec4 &color,
                        const float rotation, const glm::vec3 &scale) {
    if(_batch.quad_count >= _batch.max_quads) {
        _flush_and_reset();
    }

    _batch.api = &api;

    glm::mat4 transform = glm::translate(_ident, position) *
                        glm::rotate(_ident, glm::radians(rotation), _z_axis) *
                        glm::scale(_ident, scale);

    for(uint32_t corner = 0; corner < _corners_per_quad; corner++) {
        _batch.vertex_buffer_ptr->position = transform * _vertex_coords[corner];
        _batch.vertex_buffer_ptr->color         = color;
        _batch.vertex_buffer_ptr->texture_coord = _texture_coords[corner];
        _batch.vertex_buffer_ptr->texture_index = _white_texture_index;
        _batch.vertex_buffer_ptr->tiling_factor = _default_tiling;

        _batch.vertex_buffer_ptr++;
    }

    _batch.quad_count++;

    _stats.quad_count++;
}

如果你对此感兴趣,这里是整个Renderer2D类。希望这是足够的信息,但也没有那么多的代码在整个谢尔邦。

我所挣扎的是找出解决这个问题的角度。任何指导、理论、指示或猜测都是受欢迎的。我期待着加强我的GPU/3D数学/etc调试技能集。=)

EN

回答 1

Stack Overflow用户

发布于 2021-12-19 09:33:40

看起来您正在尝试在单个调用组中呈现多个纹理。这意味着您正在使用不是动态均匀的变量对纹理进行采样。这导致采样丢失隐式导数,实际上它们变得不明确。

有很多方法来划分一个调用组,这样您就可以以一种动态统一的方式对纹理进行采样。您可以使用3D纹理来保存所有不同的纹理,尽管这需要所有纹理都是相同大小的,或者使用纹理地图集。另一种方法是对每个唯一的纹理使用单独的绘制调用,或者更好地使用MultiDraw命令,这是相同的,但是可以将多个绘图调用分组成一个单独的调用,同时保持调用组的分离。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70407118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档