我遇到的问题与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);
}
答案 0 :(得分:0)
经过广泛的代码调查,我找到了罪魁祸首。
我使用GL_SRC1_ALPHA
和GL_ONE_MINUS_SRC1_ALPHA
代替GL_SRC_ALPHA
和GL_ONE_MINUS_SRC_ALPHA
错误地设置了混合功能。