【发布时间】:2015-04-09 22:09:07
【问题描述】:
我遇到的问题与OpenGL pixels drawn with each horizontal pair swapped 中描述的问题极为相似。主要区别在于,即使我输入纹理只有一个字节的红色值,我也会得到这种失真。
编辑:通过仔细检查普通纹理,我发现渲染任何 2D 纹理时都会出现此问题。我尝试通过交换纹理坐标来旋转生成的纹理。生成的图片仍然交换了 visual 个水平像素 - 所以我假设纹理中的数据是好的,并且在渲染纹理时会发生失真。
以下是代码的相关部分:
C++:
struct coord_t { float x; float y; }
GLint loc = glGetAttributeLocation(program, "coord");
if (loc != -1) {
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE,
sizeof(coord_t), static_cast<void *>(offsetof(coord_t, x)));
glEnableVertexAttribArray(loc);
}
loc = glGetAttributeLocation(program, "tex_coord");
if (loc != -1) {
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, sizeof(coord_t),
static_cast<void *>((void*)(4*sizeof(coord_t)+offsetof(coord_t, x)));
glEnableVertexAttribArray(loc);
}
// ... Texture binding to GL_TEXTURE_2D ...
coord_t pos[] = {coord_t{-1.f,-1.f}, coord_t{1.f,-1.f}
coord_t{-1.f,1.f}, coord_t{1.f,1.f}
};
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(pos), pos); // position
glBuffefSubData(GL_ARRAY_BUFFER, sizeof(pos), sizeof(pos), pos); // texture coordinates
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
对应的顶点着色器:
#version 110
attribute vec2 coord;
attribute vec2 tex_coord;
varying vec2 tex_out;
void main(void) {
gl_Position = vec4(coord.xy, 0.0, 1.0);
tex_out = tex_coord;
}
对应片段着色器:
#version 110
uniform sampler2D my_texture;
varying vec2 tex_out;
void main(void) {
gl_FragColor = texture(my_texture, tex_out);
}
【问题讨论】:
-
目前完全不清楚发生了什么。您应该提供更多上下文。也可能是您的绘图代码错误,或者您的 subimg 数据不是您所期望的。或两者。读回纹理数据(或在 gl 调试器中检查)也可能是个好主意。
-
你是对的,字节序不会成为问题,但对齐可能取决于
width的值。您已经使用解包对齐设置对此进行了补偿。使用这种格式读回数据可能是一个问题,这会受到包对齐的影响(默认也是 4)。 -
感谢之前的两位 cmets。我用我认为相关的实际代码中的新发现和样本扩展了这个问题。但由于我是 OpenGL 新手,我可能省略了一些重要的内容,如果有人指出,我会很高兴再次扩展它。
-
您加载的纹理不正确。很可能将其加载为 24 位而不是 32 位。你能分享更多关于纹理加载的代码吗?你也应该检查你的纹理格式。是 RGB,是 RGBA,是 ABGR,等等?您应该检查纹理加载的步幅。如果纹理是 RGB24,使用 3 的步幅。如果是 RGBA32,使用 4,等等。
-
@DimoMarkov 我知道这可能是一个问题,但如第一段所述,我正在使用 GL_RED 和 GL_UNSIGNED_BYTE 的组合加载数据 - 这意味着一次一个字节,步幅为 1。
标签: c++ opengl textures distortion