GLSL忽略片段着色器中的均匀bool比较?

时间:2018-05-27 01:01:14

标签: c++ opengl boolean glsl uniform

我正在尝试比较GLSL中的统一bool(type_2d),以便输出两种采样器类型之一 - sampler2D和samplerCube。这纯粹用于区分立方体贴图(天空盒,反射立方体贴图数据等)和sampler2d(反照率贴图,法线贴图等)。

我尝试过使用整数,浮点数和布尔值进行比较,但是帧缓冲区始终会转换为黑屏。

请记住,如果我将“主”中的bool值硬编码,例如“type_2d = false”而没有统一分配,则立方体贴图结果可以正常工作,而不是解析来自C ++的统一值。

这是“GBuffer.f”代码:

setwd("my_directory")

# variable for csv directory
csvFolder <- "csv_directory"

flist <- list.files(path = csvFolder)
masterCorpus <- data.frame()

# This vector gives you the full file list in your directory
allFilesInDirectory <- list.files(csvFolder, full=TRUE)

# This vector will read the data from allFilesInDirectory vector
allTheData <- lapply(allFilesInDirectory, read.csv, header=TRUE)

parentVector <- c("Mother","mother", "Father","father","Adult","adult","MOT","FAT")

为什么统一bool比较永远不会在片段着色器中工作?我甚至设法从GLSL获得统一值,并且解析阶段似乎工作得很好 - 这几乎就像GLSL 拒绝使用它进行比较,因此返回一个NULL纹理样本创建一个黑屏影响。任何想法?

2 个答案:

答案 0 :(得分:0)

由于一些奇怪的原因,我不得不设置glActoveTexture(GL_TEXTURE1);和glUniform1i(id,1);用于渲染立方体贴图纹理(即使我在几何体paas内部之前没有调用GL_TEXTURE0)。我想立方体贴图纹理需要额外的偏移值,因为采样器类型?想不出任何其他原因。

答案 1 :(得分:0)

在OpenGL中,单个纹理单元具有多个不同纹理类型的绑定目标,例如GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_BUFFERGL_TEXTURE_CUBE_MAP。所以从技术上讲,你可以将多个纹理绑定到一个单元。

默认情况下,GL_TEXTURE0是活动纹理单元,所有制服都初始化为0,包括采样器制服。因此,如果你jsut glBindTexture() 2D纹理和立方体贴图,你最终会得到它。

然而,虽然在GL中完全允许将几种不同的纹理类型同时绑定到单个单元,但您可以从一个特定纹理目标中采样每个单位。 OpenGL 4.6 core profile specification, Section "7.11 Samplers", page 155明确指出:

  

不允许指向不同采样器类型的变量   程序对象中的相同纹理图像单元。   只能在下一个触发着色器调用的渲染命令中检测到这种情况,   然后会生成INVALID_OPERATION错误。

因此,即使您使用制服在两个路径之间切换,您的程序对象在技术上也会使两个采样器制服都处于活动状态,并且无需将它们设置为从不同纹理单元进行采样,您最终会进入禁区。