片段着色器中的GL_TEXTURE_1D样本

时间:2016-11-01 21:40:21

标签: c++ opengl textures

尝试从一维纹理(.png)进行采样,得到一个具有正确纹理坐标的模型,但我只是无法显示纹理。几何体呈现的只是黑色,必须有一些我在OpenGL中对纹理有所了解却无法看到它的东西。

任何指针?

C ++

// 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);
}

2 个答案:

答案 0 :(得分:1)

glBindTexture(GL_TEXTURE_2D, texture);

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

假设这两行代码正在讨论相同的OpenGL对象,那么就不能这样做。使用2D纹理目标的纹理是2D纹理。它不是一维纹理,也不是具有深度为1的一层或三维纹理的二维阵列纹理。它是二维纹理。

在生成纹理对象后绑定它,texture's target is fixed。您可以使用view textures创建具有不同目标的相同存储的视图,但原始纹理对象本身不受此影响。而且您无法创建2D纹理的一维视图。

当您尝试将2D纹理绑定为1D时,应该会出现GL_INVALID_OPERATION错误。当遇到OpenGL问题时,你应该始终check for errors

答案 1 :(得分:0)

最后没有问题,只有纹理坐标加载中的错误(它从顶点采取了错误的索引..)..