2016-11-01 1 views
0

Пробовал пробовать из 1D-текстуры (.png), получил модель с правильными координатами текстуры и все, но я просто не могу получить текстуру, чтобы отобразиться. Геометрия рендеринга просто черная, должно быть что-то, о чем я пропустил, понимал текстуры в OpenGL, но не вижу ее.Образец из GL_TEXTURE_1D в фрагментном шейдере

Любые указатели?

С ++

// Setup 
GLint texCoordAttrib = glGetAttribLocation(batch_shader_program, "vTexCoord"); 
glVertexAttribPointer(texCoordAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex<float>), (const void *)offsetof(Vertex<float>, texCoord)); 
glEnableVertexAttribArray(texCoordAttrib); 

// Loading 
GLuint load_1d_texture(std::string filepath) { 
    SDL_Surface *image = IMG_Load(filepath.c_str()); 
    int width = image->w; 
    GLuint texture; 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_1D, texture); 
    glTexImage2D(GL_TEXTURE_1D, 0, GL_RGBA, width, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); 
    SDL_FreeSurface(image); 
    return texture; 
} 

// Rendering 
glUseProgram(batch.gl_program); 
glBindTexture(GL_TEXTURE_1D, batch.mesh.texture.gl_texture_reference); 
glDraw*** 

вершинных шейдеров

#version 330 core 

in vec3 position; 
in vec4 vColor; 
in vec3 normal; // Polygon normal 
in vec2 vTexCoord; 

// Model 
in mat4 model; 

out vec4 fColor; 
out vec3 fTexcoord; 

// View or a.k.a camera matrix 
uniform mat4 camera_view; 

// Projection or a.k.a perspective matrix 
uniform mat4 projection; 

void main() { 
    gl_Position = projection * camera_view * model * vec4(position, 1.0); 
    fTexcoord = vec3(vTexCoord, 1.0); 
} 

Фрагмент шейдер

#version 330 core 

in vec4 fColor; 
out vec4 outColor; 

in vec3 fTexcoord; // passthrough shading for interpolated textures 
uniform sampler1D sampler; 

void main() { 
    outColor = texture(sampler, fTexcoord.x); 
} 
+1

ли вы либо генерировать мип или изменить minicifaction фильтр в режим что не требует mipmaps? – BDL

+0

@BDL, нет. Это необходимо? – Entalpi

+0

Фильтр фильтрации по умолчанию - 'GL_NEAREST_MIPMAP_LINEAR'. Когда не отображаются mipmaps, отфильтрованное значение всегда будет черным. – BDL

ответ

1
glBindTexture(GL_TEXTURE_2D, texture); 

glBindTexture(GL_TEXTURE_1D, batch.mesh.texture.gl_texture_reference); 

Предполагая, что эти две строки кода говорят о том же объекте OpenGL, вы не можете этого сделать. Текстурой, использующей цель 2D-текстуры, является 2D-текстура. Это не 1D-текстура, не представляет собой двухмерную текстуру массива с одним слоем или 3D-текстурой с глубиной 1. Это 2D-текстура.

После связывания объекта текстуры после его создания, texture's target is fixed. Вы можете использовать view textures, чтобы создать представление того же хранилища с разными целями, но сам исходный объект текстуры не затронут этим. И вы не можете создать одномерный вид 2D-текстуры.

Вы должны были получить ошибку GL_INVALID_OPERATION, когда вы пытались привязать 2D-текстуру, как если бы она была 1D. Вы всегда должны check for errors, когда сталкиваетесь с проблемами OpenGL.

0

В конце концов, не было никаких проблем, только ошибка в текстурах координат нагрузки (она приняла неправильные индексы из вершин ..) ..