【问题标题】:Sampling from a texture in OpenGL is black从OpenGL中的纹理采样是黑色的
【发布时间】:2013-04-23 20:16:32
【问题描述】:

按照http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_06 的教程,我正在尝试图形处理

问题:当我尝试对立方体进行纹理处理时,我的样本是黑色的。

屏幕截图:http://puu.sh/2JP1H.jpg(注意:我设置 blue = uv.x 来测试我的 UV)

我查看了OpenGL textures appear just black 的线程,然后 Texture is all black,但他们似乎有不同的问题。

首先我使用 SOIL 图像加载库加载我的纹理:

int w, h;
unsigned char* img = SOIL_load_image("resources/images/4x4window.jpg",&w,&h,0,0);
ErrorIf(!img, "%s", SOIL_last_result());
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,w,h,0,GL_RGB,GL_UNSIGNED_BYTE,img);

我将纹理传递给着色器程序的渲染函数:

void onDisplay()
{
  glClearColor(1.0, 1.0, 1.0, 1.0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glUseProgram(program);

  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, texture_id);
  glUniform1i(uniform_myTexture, /*GL_TEXTURE*/0);

  glEnableVertexAttribArray(attribute_coord3d); // open shader var
  glBindBuffer(GL_ARRAY_BUFFER, vbo_cube_verts); // put stuff in buffer
  glVertexAttribPointer(attribute_coord3d, 3, GL_FLOAT, GL_FALSE, 0, 0); //send

  glEnableVertexAttribArray(attribute_texcoord);
  glBindBuffer(GL_ARRAY_BUFFER, vbo_cube_texcoords);
  glVertexAttribPointer(attribute_texcoord, 2, GL_FLOAT, GL_FALSE, 0, 0);

  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_cube_elements);
  int size; 
  glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
  glDrawElements(GL_TRIANGLES, size / sizeof(GLushort), GL_UNSIGNED_SHORT, 0);

  glDisableVertexAttribArray(attribute_coord3d);
  glDisableVertexAttribArray(attribute_texcoord);

  glutSwapBuffers();
}

顶点着色器:

attribute vec3 coord3d;
attribute vec2 texcoord;
varying vec2 f_texcoord;
uniform mat4 mvp;

void main(void)
{
  gl_Position = mvp * vec4(coord3d, 1.0);
  f_texcoord = texcoord;
}

片段着色器:

varying vec2 f_texcoord;
uniform sampler2D mytexture;

void main(void)
{
  vec4 result = texture2D(mytexture, f_texcoord);

  result.z = f_texcoord.x;
  result.w = 1;

  gl_FragColor = result;
}

【问题讨论】:

  • 您的#version 指令在哪里?还是你真的想要#version 110

标签: c++ opengl texture-mapping freeglut soil


【解决方案1】:

纹理绑定的行是:

glBindTexture(GL_TEXTURE, texture_id);

应该是:

glBindTexture(GL_TEXTURE_2D, texture_id);

【讨论】:

  • 谢谢,成功了!我应该对这个例子有所不同。后续问题:256x256 纹理工作正常puu.sh/2JRBa.jpg,但非 2 纹理的幂是不稳定的puu.sh/2JRDH.jpg
  • 嗯...我的一个 png 工作正常(盒子),但另一个很奇怪:puu.sh/2JRRv.jpg
  • 哦,我也修好了! puu.sh/2JSw3.jpg 问题是我的盒子纹理没有透明度,所以当我加载它时,格式只使用了 3 个通道(R、G 和 B)。我的另一个纹理具有透明度,所以当我加载它时,格式使用 4 个通道(R、G、B 和 A)。所以我现在只强制 4 个频道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多