四边形上的 Opengl 纹理

Posted

技术标签:

【中文标题】四边形上的 Opengl 纹理【英文标题】:Opengl texture on quad 【发布时间】:2013-03-17 10:40:39 【问题描述】:

这是我的 Texture 类的内容:

public int id;

public Texture(InputStream inputStream) 
    ByteBuffer buf = null;
    int tWidth = 0;
    int tHeight = 0;

    try 
        PNGDecoder decoder = new PNGDecoder(inputStream);
        buf = ByteBuffer.allocateDirect(4*decoder.getWidth()*decoder.getHeight());
        decoder.decode(buf, decoder.getWidth()*4, PNGDecoder.TextureFormat.RGBA);
        buf.rewind();
        inputStream.close();
     catch (IOException exception) 
        ErrorHandler.handleError("Failed to load image", exception);
    

    id = glGenTextures();
    glActiveTexture(id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tWidth, tHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf);

    glBindTexture(GL_TEXTURE_2D, 0);

这就是我的渲染方式:

    glActiveTexture(background.id);
    glBindTexture(GL_TEXTURE_2D, background.id);

    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 4*18);

    glDrawArrays(GL_TRIANGLES, 0, 6);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

    glBindTexture(GL_TEXTURE_2D, 0);

这是片段着色器:

#version 330

in vec2 textureCoordinate;

out vec4 outputColor;

uniform sampler2D texture_diffuse;

void main() 
    outputColor.rgb = vec3(1.0f, 1.0f, 1.0f);
    outputColor += texture2D(texture_diffuse, textureCoordinate);

我做错了什么? 传递给着色器程序的纹理坐标是 100% 正确的(我检查过)。但我仍然得到一个白色的四边形。

注意:我使用this png 解码器。

编辑: 我将每 4 个字节的浮点数打印到控制台,我得到 0.00.00.00.0.... 这是否意味着纹理加载不正确,或者信息以不同的格式存储到缓冲区?

【问题讨论】:

【参考方案1】:

您的片段着色器看起来不对 - 您设置了白色并添加了纹理中的值,因此它将钳制为白色。做更多这样的事情

void main() 
    outputColor.a = 1.0f;
    outputColor.rgb = texture2D(texture_diffuse, textureCoordinate);

【讨论】:

我不这么认为。我的片段着色器将所有三角形的颜色设置为白色,然后在其上添加纹理。试了很多次,一切都很好。无论如何,我试过你的代码来确定,我得到了一个后屏。那是因为四边形是绝对透明的。 不。我认为四边形是透明的,因为没有什么可添加的......我如何检查 png 解码器是否获得正确的信息? @visDEVion:除非您使用混合,否则四边形不能是透明的。 @NicolBolas 如果您没有为四边形设置任何颜色,您将看不到它。这不是让他变得透明吗? 还是黑色的,因为背景是黑色的我看不到?

以上是关于四边形上的 Opengl 纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 四边形上的纹理坐标

Mac OS X 上的 OpenGL 纹理损坏

OpenGL,渲染纹理上的异常伪影,渲染坐标? [关闭]

使用 OpenGL / LWJGL 绘制纹理四边形使用旧纹理

绘制带纹理的四边形 OpenGL

OpenGL核心配置文件不会纹理四边形