我最近在用C++编程了一段时间之后再次开始用C编程,而我对指针的理解有点生疏.
我想问一下为什么这段代码没有导致任何错误:
char* a = NULL;
{
char* b = "stackoverflow";
a = b;
}
puts(a);
Run Code Online (Sandbox Code Playgroud)
我认为因为b
超出范围,a
应该引用一个不存在的内存位置,因此它们在调用时会出现运行时错误printf
.
我在MSVC中运行此代码大约20次,并且没有显示错误.
创建单个纹理时,我可以这样做:
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_RED };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)
我可以对纹理阵列的特定图层执行此操作吗?(模糊处理仅应应用于数组中的一个纹理,而不应应用于其他纹理)。
我怀疑这是不可能的,如果可以,首选的方法是什么?(顶点属性是我的最后选择)。
(i)编辑:最好寻找OpenGL 3.3或以下版本的解决方案。
(ii)编辑:我的想法是我为游戏创建了RGBA位图(草,墙等),并且还拥有了字体位图。我正在尝试在同一绘制调用中渲染它们。
在片段着色器中,我有类似以下内容:
uniform sampler2DArray TextureArraySampler;
out vec4 FragmentColor;
in VertexOut
{
vec2 UV;
vec4 COLOR;
flat uint TEXTURE_INDEX;
} In;
void main(void)
{
FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX));
}
Run Code Online (Sandbox Code Playgroud)
因此,当渲染字体时,我希望着色器采样如下:
FragmentColor = In.COLOR * vec4(1, 1, 1, texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).r);
Run Code Online (Sandbox Code Playgroud)
并且,在渲染位图时:
FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).rgba;
Run Code Online (Sandbox Code Playgroud)