【问题标题】:OpenGL Textures not applied correctlyOpenGL 纹理未正确应用
【发布时间】:2013-04-10 06:52:34
【问题描述】:

我有一些关于在 OpenGL 中为对象添加颜色和纹理的问题。我有一个小场景。在这个场景中,我有两个盒子。

问题:

  1. 假设我想要一个盒子是纯色的,另一个盒子是有纹理的。 在我画盒子之前。 1 我做glcolor 并设置我的立方体的颜色。只要我不为下一个立方体绑定纹理,这项工作就很好。当我绑定一个纹理时,我的两个立方体最终都具有相同的纹理。我怎样才能让这个玩得很好?我可以在同一个“场景”中同时使用 glColor 和绑定纹理吗?

  2. 似乎纹理没有拉伸以适应盒子的整个侧面。这是因为我弄乱了纹理坐标还是某个地方的设置?

  3. 假设我想在一个平面上多次重复纹理。我该怎么做呢?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    1你需要先绑定那个纹理,绘制立方体,用glBindTexture(..., 0)解绑纹理,然后绘制其他立方体

    还要注意将纹理立方体的颜色设置为白色,以便您看到立方体的所有颜色。

    2您可能没有正确设置纹理坐标,还请注意您需要正确发送多边形

    例子

    glBegin(GL_TRIANGLES);
    <texture coordinates for point 1 of polygon 1>
    <coordinates for point 1 of polygon 1>
    
    <texture coordinates for point 2 of polygon 1>
    <coordinates for point 2 of polygon 1>
    
    <texture coordinates for point 3 of polygon 1>
    <coordinates for point 3 of polygon 1>
    
    <texture coordinates for point 1 of polygon 2>
    <coordinates for point 1 of polygon 2>
    ...
    

    3只需将纹理坐标设置为大于1.0的值,并将纹理模式设置为repreating

    【讨论】:

    • 1.有人说我应该做 glDisable(GL_TEXTURE_2D) 或 glBindTexture(GL_TEXTURE_2D, 0)。什么是最好的和正确的做法?
    • 我会使用 glBindTexture 因为要激活你只需要一个调用 (glBindTexture(..., Id)) 而不是两个 (glEnable(GL_TEXTURE_2D); glBindTexture(..., Id))跨度>
    • @Quonux:虽然禁用纹理是更好的方法。纹理单元 0 可能附加了实际的纹理数据(这是 OpenGL-1.0 的遗留物,它没有纹理单元,但使用显示列表来模拟纹理对象)。绑定纹理0不会禁用纹理固定功能OpenGL!
    • @datenwolf novadays 在现代显卡上没有更多“固定功能 OpenGL”的东西,它都是用驱动程序模拟的
    • @Quonux:我知道(提示,看看 StackOverflow OpenGL 标签的顶级用户)。但是,当您使用固定功能管道时,驱动程序必须模拟 FFP。这意味着启用纹理并绑定纹理单元 0 后,它实际上可能会应用纹理,因为在 FFP 中,纹理单元 0 并不意味着禁用。事实上,绑定 0 无论你可以绑定什么(VBO、PBO、FBO)并不意味着“禁用”而是“默认”(在 VBO 和 PBO 的情况下,默认意味着客户端内存访问,而在带有 VAO 的 OpenGL-4 中默认意味着未定义,但未禁用!)
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多