Текстура трубки OpenGL - PullRequest
0 голосов
/ 27 мая 2018

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

Задняя часть трубкиBack of the tube

Передняя часть трубки Front of the tube

Texture::Texture(const std::string& fileName)
{
    int width, height, numComponents;
    unsigned char* data = stbi_load((fileName).c_str(), &width, &height, &numComponents, 4);

    if (data == NULL)
        std::cerr << "Unable to load texture: " << fileName << std::endl;

    glGenTextures(1, &m_texture);
    glBindTexture(GL_TEXTURE_2D, m_texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    stbi_image_free(data);
}

Texture::~Texture()
{
    glDeleteTextures(1, &m_texture);
}

void Texture::Bind()
{
    glBindTexture(GL_TEXTURE_2D, m_texture);
}

#version 130--fragment shader

varying vec2 texCoord0;
varying vec3 normal0;
varying vec3 color0;

uniform sampler2D ourTexture1;  // added

uniform vec3 lightDirection;
uniform vec3 MinMax;

void main()
{
    //vec3 tmp = dot(-lightDirection, normal0) * color0 ;44
    gl_FragColor = texture(ourTexture1, texCoord0);
    if(color0.y<MinMax.x||color0.y>MinMax.y)
        gl_FragColor=vec4(1.0,1.0,1.0,1.0); 

}

#version 120-vertex shader

attribute vec3 position;
attribute vec2 texCoord;
attribute vec3 normal;
attribute vec3 color;

varying vec2 texCoord0;
varying vec3 normal0;
varying vec3 color0;

uniform mat4 MVP;
uniform mat4 Normal;

void main()
{
    gl_Position = MVP * vec4(position, 1.0);

    texCoord0 = texCoord; 
    texCoord0[0]=0.25+texCoord0[0];
    if(texCoord0[0]>=1)
    {
        texCoord0[0]=texCoord0[0]-1;
    }

    texCoord0[1]=1-texCoord0[1];
    color0 = position;
    normal0 = (Normal * vec4(normal, 0.0)).xyz;
}

1 Ответ

0 голосов
/ 27 мая 2018

Проблема почти наверняка исходит от следующей части вашего вершинного шейдера:

texCoord0[0]=0.25+texCoord0[0];
if(texCoord0[0]>=1)
{
    texCoord0[0]=texCoord0[0]-1;
}

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

Обычно вам нужно просто применить смещение и позволить конвейеру рендеринга позаботиться о работе модуля.,Так что я бы ожидал увидеть это:

texCoord0[0]=0.25+texCoord0[0];

NB

Вы все еще можете увидеть проблему, если вы разделяете вершины по всей окружности трубки.Точка меша, где координаты текстуры «зацикливаются», должна иметь дублированные вершины с разными UV.

...