我正在尝试理解OpenGL 4.5中的纹理,纹理单元和采样器.我附上了一张我想弄清楚的图片.我认为在我的例子中一切都是正确的,但我不太确定右侧带有问号的1D采样器.
所以,我知道OpenGL提供了许多纹理单元/绑定点,纹理和采样器可以绑定在一起,因此它们可以协同工作.
这些绑定点中的每一个都可以支持每个纹理目标中的一个(在我的情况下,我是绑定目标GL_TEXTURE_2D和GL_TEXTURE_1D绑定点0,另一个GL_TEXTURE_2D绑定到绑定点1).
另外,采样器可以以相同的方式绑定到这些绑定点(我已经将2D采样器绑定0到pic中的绑定点).
执行这些操作的功能是glBindTextureUnit和glBindSampler.
我最初的想法是将1D采样器绑定到绑定点0,并且在着色器中根据绑定点和采样器的类型进行匹配:
layout (binding = 0) uniform sampler1D tex1D;
layout (binding = 0) uniform sampler2D tex2D;
Run Code Online (Sandbox Code Playgroud)
引用来源:
每个纹理图像单元都支持绑定到所有目标.因此,2D纹理和阵列纹理可以绑定到同一图像单元,或者不同的2D纹理可以绑定在两个不同的图像单元中而不会相互影响.那么在渲染时会使用哪种纹理?在GLSL中,这取决于使用此纹理图像单元的采样器的类型.
但我发现了以下声明:
[..]听起来很可疑,就像你可以为不同的采样器使用相同的纹理图像单元,只要它们具有不同的纹理类型.不要这样做.该规范明确禁止它; 如果两个不同的GLSL采样器具有不同的纹理类型,但是与相同的纹理图像单元相关联,则渲染将失败.为每个采样器提供不同的纹理图像单元.
所以,我的问题是,如果最终单个采样器将被绑定到该绑定点,强制您选择,那么将不同纹理目标绑定到同一个绑定点的目的是什么?
我引用的信息:https://www.khronos.org/opengl/wiki/Texture#Texture_image_units
我的AngularJS 2应用程序有几个样式文件,我与一个gulp任务连接.这一切都很好,因为它们最终会出现在我发送给浏览器的大文件中.我的问题是关于Angular 2 @Component及其styleUrls属性.
@Component({
selector: 'hero',
templateUrl: 'hero/hero.template.html',
styleUrls: ['hero/hero.component.css'],
inputs: ['hero']
})
Run Code Online (Sandbox Code Playgroud)
由于默认模式下的影子DOM模拟(模拟),其中定义的样式hero/hero.component.css仅应用于我想要的组件.我的问题是,串联会发生什么?我无法捆绑多个中指定的所有CSS文件,styleUrls因为我们要破坏封装的目的:组件的样式会泄漏到整个文档.但是,我不想为组件需要的每个CSS文件进行生产调用.我如何连接这些样式(并可能缩小它们),以便客户端在一次调用中获取所有样式,并仍然保留封装?
@Input我有一个接受这样的组件:
@Input() thing:Thing; // error!
Run Code Online (Sandbox Code Playgroud)
它以通常的方式传递给组件:
<my-component [thing]="thatThing"></my-component>
Run Code Online (Sandbox Code Playgroud)
我认为由于严格模式,我收到以下编译器错误:Property 'thing' has no initializer and is not definitely assigned in the constructor.有没有办法在不填充虚拟数据的情况下摆脱它,同时保持严格模式(如果这确实是原因),并且只依赖于填充的输入来自实例化组件的人?我实际上没有分配给 的默认值thing,并且nullorundefined似乎也不起作用。
我正在尝试使用着色器存储缓冲区对象(又名缓冲区块),但有些事情我还没有完全掌握。我想做的是在其中存储不确定数量的灯光的(简化)数据n,以便我的着色器可以遍历它们并执行计算。
首先,我说我得到了正确的结果,并且OpenGL没有错误。然而,困扰我不知道为什么它是工作。
因此,在我的着色器中,我得到了以下内容:
struct PointLight {
vec3 pos;
float intensity;
};
layout (std430, binding = 0) buffer PointLights {
PointLight pointLights[];
};
void main() {
PointLight light;
for (int i = 0; i < pointLights.length(); i++) {
light = pointLights[i];
// etc
}
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中:
struct PointLightData {
glm::vec3 pos;
float intensity;
};
class PointLight {
// ...
PointLightData data;
// ...
};
std::vector<PointLight*> pointLights;
glGenBuffers(1, &BBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, BBO);
glNamedBufferStorage(BBO, n * sizeof(PointLightData), NULL, GL_DYNAMIC_STORAGE_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, …Run Code Online (Sandbox Code Playgroud) 所以我想在 Vulkan 中渲染两个独立的网格。我涉足纹理,第一个网格使用 4 个,而第二个使用 5 个。我在做索引绘制。
为了简单起见,每个网格都有自己的统一缓冲区和采样器数组,它们打包成单独的描述符集,每个描述符集都有一个 UBO 绑定和另一个采样器绑定。以下代码针对每个网格运行,其中descriptorSet是与单个网格关联的描述符集。filepaths是网格特别使用的图像路径向量。
std::vector<VkWriteDescriptorSet> descriptorWrites;
descriptorWrites.resize(2);
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = buffers[i];
bufferInfo.offset = 0;
bufferInfo.range = sizeof(UniformBufferObject);
descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrites[0].dstSet = descriptorSet;
descriptorWrites[0].dstBinding = 0;
descriptorWrites[0].dstArrayElement = 0;
descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
descriptorWrites[0].descriptorCount = 1;
descriptorWrites[0].pBufferInfo = &bufferInfo;
std::vector<VkDescriptorImageInfo> imageInfos;
imageInfos.resize(filepaths.size());
for (size_t j = 0; j < filepaths.size(); j++) {
imageInfos[j].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageInfos[j].imageView = imageViews[j];
imageInfos[j].sampler = samplers[j];
}
descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrites[1].dstSet = descriptorSet; …Run Code Online (Sandbox Code Playgroud) 我懂了:
// mouse.h
class Mouse {
private:
struct Pos {
static GLfloat x;
static GLfloat y;
};
static Pos last;
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
// mouse.cpp
// 1)
Mouse::Pos Mouse::last = {};
// 2)
Mouse::Pos Mouse::last = { 0.0, 0.0 };
// 3)
Mouse::last.x = 0.0f;
Mouse::last.y = 0.0f;
Run Code Online (Sandbox Code Playgroud)
1),2)并且3)是我在初始化那个东西的企图.我理解标题应该声明它last是static,并且源应该初始化它,但是我的所有尝试都出错了.有人可以告诉我这样做的正确方法吗?我错过了一些非常重要的观点吗?这是胡说八道吗?字段是静态的很重要.谢谢.
c++ ×4
angular ×2
opengl-4 ×2
3d ×1
bufferblock ×1
class ×1
css ×1
data-binding ×1
opengl ×1
shadow-dom ×1
static ×1
struct ×1
textures ×1
typescript ×1
vulkan ×1