OpenGL, текстура выводится сплошным цветом - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь текстурировать свою местность, но мне кажется, что нужно либо взять средний цвет текстуры, либо просто выбрать один цвет из текстуры и использовать его повсюду.Я смотрел на другие решения, но они не помогли мне.Я новичок, так что это может быть простая ошибка

Текстуры генерируются из SOIL2

Создает текстуру

int texID = SOIL_load_OGL_texture(
    filename.c_str(),
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

Создает координаты UV (удалены не важные вещи для моеговопрос)

int i=0;
for (int z = 0; z < m_Size; z++) // loop through columns
{
    for (int x = 0; x < m_Size; x++) // loop through rows
    {
        model.mesh.uvs[i] = Math::Vector2(x / m_Size, z / m_Size); //Terrain is square
        i++;
    }

}

Создает буфер текстур

if (model->mesh.numOfUVs != 0)
{
    glGenBuffers(1, &model->textureBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, model->textureBufferID);
    glBufferData(GL_ARRAY_BUFFER, model->mesh.numOfUVs * sizeof(Math::Vector2), model->mesh.uvs, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Math::Vector2), (void*)(0));     
}

Рисование ландшафта (не полный код)

            glBindVertexArray(ID);

            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, model->textureID1);
            unsigned int textureLocation = glGetUniformLocation(shaderID, "grassTex");
            glUniform1i(textureLocation, 0);

            glUniformMatrix4fv(glGetUniformLocation(shaderID, "MVP"), 1, false, &newMVP.mat[0][0]);

            glDrawElements(GL_TRIANGLES, model->mesh.numOfIndices, GL_UNSIGNED_INT, (void*)0);


            glBindVertexArray(0);

Vert Shader

#version 330 core

layout(location = 0) in vec2 texturecoord;

uniform mat4 MVP;

out vec2 texcoord;

void main(){
    texcoord = texturecoord;
    gl_Position = MVP * vec4(in_position, 1);
}

Frag Shader

#version 330 core

layout(location = 0) out vec4 out_colour;

in vec2 texcoord;
uniform sampler2D grassTex;

void main()
{
    out_colour = texture2D(grassTex, texcoord);
}

Если что-то не имеет смысла, это может быть потому, что я удалил много кода, чтобы попытаться уменьшить объем кода, который я публикую

чтоэто похоже на (есть 3 текстуры на картинке, но я удалил код в этом посте, так как я не думаю, что это имеет какое-либо отношение к числу текстур, которые я использую) https://imgur.com/a/rSPp7Ru

1 Ответ

1 голос
/ 20 апреля 2019

Проблема в целочисленном делении.Когда вы делите целые числа, вы получаете целое число.Здесь вы генерируете UV-координаты.

for (int z = 0; z < m_Size; z++) // loop through columns
{
    for (int x = 0; x < m_Size; x++) // loop through rows
    {
        model.mesh.uvs[i] = Math::Vector2(x / m_Size, z / m_Size); //Terrain is square
        i++;
    }
}

x и z всегда меньше m_Size.Это означает, что x / m_Size и z / m_Size всегда 0, потому что вы не можете хранить 0.2 в int.Поскольку все ваши UV-координаты 0, 0, вы просто видите один угол (я думаю, что он слева внизу) текстуры по всему треугольнику.

Чтобы решить эту проблему, наведите один из операндов наfloat или double.

model.mesh.uvs[i] = Math::Vector2(
  static_cast<float>(x) / m_Size, 
  static_cast<float>(z) / m_Size
);

Если вы поделите float на int, int повысится до float, поэтому будет выполнено float.

...