小编Mat*_*000的帖子

引用超出范围的char*

我最近在用C++编程了一段时间之后再次开始用C编程,而我对指针的理解有点生疏.

我想问一下为什么这段代码没有导致任何错误:

char* a = NULL;
{
    char* b = "stackoverflow";
    a = b;
}

puts(a);
Run Code Online (Sandbox Code Playgroud)

我认为因为b超出范围,a应该引用一个不存在的内存位置,因此它们在调用时会出现运行时错误printf.

我在MSVC中运行此代码大约20次,并且没有显示错误.

c

35
推荐指数
4
解决办法
1659
查看次数

glTexSubImage3D(GL_TEXTURE_2D_ARRAY,...)和GL_TEXTURE_SWIZZLE_RGBA

  • 我有一个纹理数组(〜512层)。
  • 我上传的某些纹理有4个通道(RGBA),有些只有一个(RED)。

创建单个纹理时,我可以这样做:

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)

opengl

1
推荐指数
1
解决办法
127
查看次数

标签 统计

c ×1

opengl ×1