簡體   English   中英

如何從 OpenGL 着色器中的紋理貼圖繪制貼圖?

[英]How I can draw a tile from a texture tilemap in an OpenGL shader?

因此,我有一個 AtlasTexture,其中包含繪制瓷磚 map 所需的所有瓷磚。

現在我通過制服傳遞 AtlasTexture,想法是將紋理坐標更改為 select 只是我需要從圖集中獲得的部分。

問題是我只能在片段着色器上指定從零原點切割紋理,是否可以指定一個 offsetX 來告訴着色器我想從哪里開始繪制?

float vertices[] = {
    // aPosition     // aTextureCoordinate
    0.0f,   0.0f,    0.0f, 0.0f,
    100.0f, 0.0f,    1.0f, 0.0f,
    0.0f,   100.0f,  0.0f, 1.0f,
    100.0f, 100.0f,  1.0f, 1.0f,
};

uint32_t indices[] = {0, 1, 2, 2, 3, 1};

頂點着色器

#version 330 core

layout(location = 0) in vec2 aPosition;
layout(location = 1) in vec2 aTextureCoordinate;
out vec2 textureCoordinate;

void main() {
    gl_Position = vec4( aPosition.x, aPosition.y, 1.0f, 1.0f);
    textureCoordinate = vec2(
    aTextureCoordinate.x / 3.0f, // This selects the first tile in the uAtlasTexture
    aTextureCoordinate.y
    );
}

片段着色器

#version 330 core

in vec2 textureCoordinate;
uniform sampler2D uAtlasTexture; // Has 3 tiles
out vec4 color;

void main() {
    color = texture(uAtlasTexture, textureCoordinate);
}

使用Uniform變量作為偏移量。 `vec2(1.0/3.0 + aTextureCoordinate.x / 3.0f, aTextureCoordinate.y); “選擇 2 第二個瓷磚。使用制服而不是 1.0/3.0:

#version 330 core

layout(location = 0) in vec2 aPosition;
layout(location = 1) in vec2 aTextureCoordinate;
out vec2 textureCoordinate;

uniform float textureOffsetX;

void main() {
    gl_Position = vec4( aPosition.x, aPosition.y, 1.0f, 1.0f);
    textureCoordinate = vec2(
        textureOffsetX + aTextureCoordinate.x / 3.0f, 
        aTextureCoordinate.y
    );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM