GLSL 中的多个纹理 - 只有一个有效

2024-01-03

我的问题是在 GLSL 着色器中获取多个纹理。 这就是我正在做的:

Shader:

uniform sampler2D sampler0;
uniform sampler2D sampler1;
uniform float blend;
void main( void )
{
    vec2 coords = gl_TexCoord[0];
    vec4 col = texture2D(sampler0, coords);
    vec4 col2 = texture2D(sampler1, coords);
    if (blend > 0.5){
        gl_FragColor = col;
    } else {
        gl_FragColor = col2;
    }
};

因此,我只是根据统一变量在两个颜色值之间进行选择。足够简单(这是一个测试),但是当混合 时,我得到全黑 ,而不是预期的行为。

OpenGL代码:

m_sampler0location = m_shader.FindUniform("sampler0");
m_sampler1location = m_shader.FindUniform("sampler1");
m_blendlocation = m_shader.FindUniform("blend");

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler0location, 0);
glBindTexture(GL_TEXTURE_2D, Texture0.Handle);  
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler1location, 1);
glBindTexture(GL_TEXTURE_2D, Texture1.Handle);
glBegin(GL_QUADS);
    //lower left
    glTexCoord2f(0, 0);
    glVertex2f(-1.0, -1.0);
    //upper left
    glTexCoord2f(0, maxCoords0.t);
    glVertex2f(-1.0, 1.0);
    //upper right
    glTexCoord2f(maxCoords0.s, maxCoords0.t);
    glVertex2f(1.0, 1.0);
    //lower right
    glTexCoord2f(maxCoords0.s, 0);
    glVertex2f(1.0, -1.0);
glEnd()

着色器是在这一切之前编译和绑定的。该过程中的所有健全性检查都表明一切正常。 正如我所说,的价值col在着色器程序中反射纹理中的片段;的价值col2是黑色的。显示的纹理是最后一个活动纹理 - 如果我更改最后一个glBindTexture绑定Texture0.Handle,纹理发生变化。 根据巴巴尔的回复修复。

事实上,即使我添加类似的内容,场景也会呈现全黑gl_FragColor.r = blend;作为着色器的最后一行。但是,如果我注释掉这个电话glActiveTexture(GL_TEXTURE1);,着色器再次工作,相同的纹理出现在sampler0和sampler1中。

这是怎么回事?有问题的线路,glActiveTexture(GL_TEXTURE1);,似乎工作得很好,随后的结果证明了这一点glGetIntegerv(GL_ACTIVE_TEXTURE, &anint)。为什么它会如此可怕地破坏一切?我已经尝试升级我的显示驱动程序。


这是一个基本的 GLUT 示例(在 OS X 上编写,根据需要进行调整),它生成两个棋盘纹理,加载带有两个采样器的着色器,并通过对每个采样器着色(一红一蓝)和混合来组合它们。看看这是否适合您:

#include <stdio.h>
#include <stdlib.h>

#include <GLUT/glut.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

#define kTextureDim 64

GLuint t1;
GLuint t2;

/* adapted from the red book */
GLuint makeCheckTex() {
    GLubyte image[kTextureDim][kTextureDim][4]; // RGBA storage

    for (int i = 0; i < kTextureDim; i++) {
        for (int j = 0; j < kTextureDim; j++) {
            int c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0))*255;
            image[i][j][0]  = (GLubyte)c;
            image[i][j][1]  = (GLubyte)c;
            image[i][j][2]  = (GLubyte)c;
            image[i][j][3]  = (GLubyte)255;
        }
    }

    GLuint texName;
    glGenTextures(1, &texName);    
    glBindTexture(GL_TEXTURE_2D, texName);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureDim, kTextureDim, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);

    return texName;
}

void loadShader() {
#define STRINGIFY(A) #A

    const GLchar* source = STRINGIFY(

                                     uniform sampler2D tex1;
                                     uniform sampler2D tex2;

                                     void main() {
                                         vec4 s1 = texture2D(tex1, gl_TexCoord[0].st);
                                         vec4 s2 = texture2D(tex2, gl_TexCoord[0].st + vec2(0.0625, 0.0625));
                                         gl_FragColor = mix(vec4(1, s1.g, s1.b, 0.5), vec4(s2.r, s2.g, 1, 0.5), 0.5);
                                     }

                                     );

    GLuint program = glCreateProgram();
    GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(shader, 1, &source, NULL);
    glCompileShader(shader);

    GLint logLength;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
    if (logLength > 0) {
        GLchar* log = (GLchar*)malloc(logLength);
        glGetShaderInfoLog(shader, logLength, &logLength, log);
        printf("Shader compile log:\n%s\n", log);
        free(log);
    }

    glAttachShader(program, shader);  
    glLinkProgram(program);

    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
    if (logLength > 0) {
        GLchar* log = (GLchar*)malloc(logLength);
        glGetProgramInfoLog(program, logLength, &logLength, log);
        printf("Program link log:\n%s\n", log);
        free(log);
    }

    GLuint t1Location = glGetUniformLocation(program, "tex1");
    GLuint t2Location = glGetUniformLocation(program, "tex2");

    glUniform1i(t1Location, 0);
    glUniform1i(t2Location, 1);

    glUseProgram(program);
}


void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_FLAT);

    t1 = makeCheckTex();
    t2 = makeCheckTex();

    loadShader();
}


void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, t1);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, t2);

    glBegin(GL_QUADS);
    //lower left
    glTexCoord2f(0, 0);
    glVertex2f(-1.0, -1.0);
    //upper left
    glTexCoord2f(0, 1.0);
    glVertex2f(-1.0, 1.0);
    //upper right
    glTexCoord2f(1.0, 1.0);
    glVertex2f(1.0, 1.0);
    //lower right
    glTexCoord2f(1.0, 0);
    glVertex2f(1.0, -1.0);
    glEnd();

    glutSwapBuffers();
}


void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2, 2, -2, 2, -2, 2);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}


int main(int argc, char **argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);

    glutInitWindowSize(512, 512);
    glutInitWindowPosition(0, 0);

    glutCreateWindow("GLSL Texture Blending");

    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutIdleFunc(display);

    init();

    glutMainLoop();
    return 0;
}

Hopefully the result will look something like this (you can comment out the glUseProgram call to see the first texture drawn without the shader): alt text

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLSL 中的多个纹理 - 只有一个有效 的相关文章

  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • WebGL - 如何传递无符号字节顶点属性颜色值?

    我的顶点由具有以下结构的数组组成 Position colour float float float byte byte byte byte 传递顶点位置没有问题 gl bindBuffer gl ARRAY BUFFER this vbo
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • OpenGL ES 2.0 中的纹理点?

    我正在尝试在 OpenGL ES 2 0 中为粒子系统实现纹理点 例如点精灵 我遇到的问题是所有点都渲染为实心黑色方块 而不是正确映射纹理 我已经验证 gl PointCoord 实际上返回从 0 0 到 1 0 的 x y 值 这将映射到
  • 在 Three.js 中从 Web Worker 加载纹理

    当将大纹理图像应用到网格上一段明显的时间时 Three js 会锁定浏览器的主线程 让我们考虑以下示例 var texLoader new THREE TextureLoader texLoader load someLargeTextur
  • Visual Studio 2010 中的 SOIL 设置

    我无法得到SOIL http www lonesock net soil html正确使用 Visual Studio 2010 我远非 VS 专家 但据我所知 只需执行以下步骤即可使环境正常运行 属性 gt gt C C gt 常规 gt
  • Glew+GLFW Win32 无依赖项 Visual Studio

    是否可以在不将文件复制到 C 的情况下构建并链接 Glew 和 GLFW 我找不到任何说明如何在不将 DLL 复制到 C 上的 Visual Studio 目录的情况下使用这些库的文档 我只想包含项目目录中所需的所有 dll 和 lib 文
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 重新创建窗口而不破坏上下文

    这个问题是关于使用 OpenGL 的图形应用程序 当时我正在使用 GLFW 框架 但我考虑更改它 我的目标是让用户 尽可能 在全屏模式和窗口模式之间不断切换 此过程应该花费不到一秒的时间 并且可以在运行时发生 例如 看看游戏 我的世界 用户
  • 有没有好的 GLSL 哈希函数?

    所以我对这个问题的古老评论仍然得到了支持 GLSL rand 这一行代码的起源是什么 https stackoverflow com questions 12964279 whats the origin of this glsl rand
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • 帧缓冲区/颜色缓冲区?

    有人可以指出我两者是否相同吗 我的意思是我一直在阅读有关它的信息 这里的红皮书说 颜色缓冲区本身可以由多个子缓冲区组成 系统上的帧缓冲区包含所有这些缓冲区 here http glprogramming com red chapter10
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let

随机推荐

  • 获取属性的值

    这是我的 XML
  • 如何在Java运行时创建动态类

    在运行时更改现有 Java 文件的某些属性后 是否可以从现有 Java 文件创建新的 Java 文件 假设我有一个java文件 public class Student private int rollNo private String n
  • 选择 SQL Server 数据库大小

    我怎样才能查询我的sql服务器只获取数据库的大小 我用过这个 use MY DB exec sp spaceused 我懂了 database name database size unallocated space My DB 17899
  • 以数组形式返回 sql 查询

    我正在使用 jqueryui 及其自动完成插件 它使用 json 来提取项目 我想修改它 以便从我的数据库中提取项目 物品应该是这样的 items array Great em Bittern em gt Botaurus stellari
  • 检查文本是否为 HTML

    我正在使用 Meteor 我正在尝试检查文本是否为 html 但通常的方法不起作用 这是我的代码 post function var postId Session get postId var post Posts findOne id p
  • RGB 到 HSI 以及 HSI 到 RGB 转换

    我正试图掩饰RGB to HSI并恢复它 该任务需要从头开始 In RGB to HSI转换 饱和度和强度输出都很好 但我似乎没有明白Hue的表述有什么问题 示例输出 Red 255 Green 255 Blue 255 Hue 21474
  • Nginx LetsEncrypt 错误“/etc/letsencrypt/options-ssl-nginx.conf”没有这样的文件或目录

    我正在尝试使用 LetsEncrypt 和 Nginx 添加 https 我已经添加了 certbot 并且它运行成功 然后 当尝试运行 Nginx 服务器时 我收到此错误 docker entrypoint sh docker entry
  • EF4 CTP5 的存储库模式

    我正在尝试使用 ef4 ctp5 实现存储库模式 我想出了一些东西 但我不是 ef 方面的专家 所以我想知道我所做的是否是好事 这是我的数据库上下文 public class Db DbContext public DbSet
  • 用户输入和命令行参数[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何拥有可以接受用户输入的 Python 脚本 如果从命令行运行 如何让它读取参数 要读取用户输入 您可以尝试the cmd modu
  • 使用给定的部分大小列表将 Scala 列表拆分为多个部分。[分区]

    我有两个清单 val list1 List Int List 5 2 6 val list2 List Any List a b c d e f g h i j k 这样list1 sum gt list2 size 我想要一个由 list
  • UIWebview 使用 javascript 在移动 safari 中打开 URL

    所以我正在使用 Phaser 构建一个 HTML5 游戏 并且有一个按钮可以调用 javascript 中的 URL 如下所示 window open http google com blank 这在桌面上在新窗口中打开时效果很好 我也可以
  • 使用 WS-Security 连接到 Java SOAP Web 服务的 WCF 客户端

    我在使用 SOAP 1 1 连接到 Java Web 服务的 NET WCF 客户端时遇到问题 该服务需要通过 SSL 进行传输级加密 并使用 WS Security 协议进行 SOAP 安全性 两者都使用相同的证书 我已安装证书并且可以连
  • 需要有关 Play 2.2 子模块以及其他模块作为依赖项的项目布局的建议

    我有一个带有模块的现有 SBT 项目 我想将 Play 2 2 作为子模块添加到我的项目中 这个新的 Play 模块将依赖于其他模块 到目前为止我发现的主要是 Play 是带有支持模块的主要项目 如果 Play 确实支持此设置 请为我指出正
  • Dart RegExp 字边界等效项

    我尝试在我的 flutter 应用程序中匹配包含确切单词 world 的单词和句子 我认为最好的方法是使用单词边界 我的正则表达式如下所示 String str world var regexp RegExp b str b caseSen
  • 如何从俄语Excel中的日期获取英文月份名称?

    我无法在 Excel 中获取月份名称 Neither TEXT mmmm 不不行 我发现 尽管有语言设置 但只有俄罗斯 M 正在工作并提供俄语月份名称 拉丁M什么也没给出 是否有其他设置可以强制月份名称语言 UPDATE 设置日期格式国籍没
  • 单引号字符

    反引号 和 是单引号的两个不同字符 我有一个 mysql 脚本 显示前两个引号字符 如果我将它们更改为 则会破坏语法 如何从键盘输入 You are referring to the character commonly called a
  • 我收到 java.lang.classnotfoundException: com.mysql.jdbc.Driver

    How come I get this error Check the picture 我在普通的 java 项目 不是 android 项目 上使用了相同的 jar 它曾经可以工作 怎么了 You re getting a NoClass
  • 从java调用gnuplot? (Ubuntu)

    我不确定这是否可行 特别是因为 Java 通过虚拟机运行 但我可以从 Java 中调用 gnuplot 吗 也许我可以让 Java 打开一个终端并输入 gnuplot plot etc Use gnujavaplot http gnujav
  • 有没有办法禁止电子邮件引擎自动超链接 URL?

    我的一位客户想要禁用 URL 显示为超链接 URL 它必须被识别为纯文本 这是我尝试过的 a href url a 我也尝试过删除 a a 标签 以及删除 URL 中的 http 但它们在 Outlook 中都不起作用 Outlook 仍然
  • GLSL 中的多个纹理 - 只有一个有效

    我的问题是在 GLSL 着色器中获取多个纹理 这就是我正在做的 Shader uniform sampler2D sampler0 uniform sampler2D sampler1 uniform float blend void ma