簡體   English   中英

在VBO中為特定三角形使用不同的紋理

[英]Use different texture for specific triangles in VBO

我有9個由三角形組成的四邊形,如下所示:

在此輸入圖像描述

我正在使用VBO存儲有關它們的數據 - 它們的位置和紋理坐標。

我的問題是 - 是否可以通過僅使用一個VBOshader器使四邊形5具有與其他四邊形不同的紋理?

在此輸入圖像描述

綠色代表紋理1和黃色 - 紋理2。

到目前為止我得到了:

GLfloat vertices[] = { 
    // Positions
    0.0f, 0.0f,
    ...

    // Texture coordinates
    0.0f, 0.0f, 
    ...
};

我正在使用vertices[]數組創建VBO ,然后我綁定了我的第一個紋理m_texture1 (我也可以訪問第二個 - m_texture2 )並調用着色器:

glBindTexture(GL_TEXTURE_2D, m_texture1);

glUseProgram(program);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboId);          // for vertex coordinates
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);                                      // Vertices
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(GLfloat)*108));           // Texture
glDrawArrays(GL_TRIANGLES, 0, 108);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glUseProgram(0);

我的頂點着色器:

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec2 texcoord;

out vec2 Texcoord;

void main()
{
    gl_Position = position;
    Texcoord = texcoord;
}

片段着色器:

#version 330

in vec2 Texcoord;

out vec4 outputColor;

uniform sampler2D tex;

void main()
{
    outputColor = texture(tex, Texcoord) * vec4(1.0,1.0,1.0,1.0);
}

所以基本上我只在這里使用一個紋理,因為我不知道如何使用第二個紋理。

您可以使用不同的紋理圖像單元並將其值設置為uniform sampler2D tex

您必須調用glActiveTexture並設置紋理圖像單元(GL_TEXTURE0),綁定綠色紋理,然后將活動紋理設置為GL_TEXTURE1並綁定您的黃色紋理。 這樣,綠色紋理將具有紋理圖像單元ID 0和黃色1。

您必須將繪圖調用拆分為兩個:一個用於綠色四邊形,另一個用於黃色。 您必須通過使用glUniform1i為每個調用設置uniform sampler2D tex來設置要使用的紋理。 最后調用glDrawArrays以獲取VBO中的三角形子集,指示您在當前調用中繪制的綠色或黃色三角形。

如果您需要繪制的所有內容都是示例中的圖片,您也可以考慮使用紋理圖集 在這種情況下,您將在單個調用中映射單個紋理。

暫無
暫無

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

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