gpt4 book ai didi

java - GLSL 将循环数据存储在常量数组中

转载 作者:行者123 更新时间:2023-12-04 08:51:33 26 4
gpt4 key购买 nike

我对着色器很陌生,我很难理解什么可以做,什么不能做。例如,我有一个 3d 体素地形。每个顶点有 3 个信息:它的位置、它的颜色和它的法线。每个顶点的位置几乎都是独一无二的,但它们只有 6 个可能的法线,左上右下向前向后,以及在我的游戏中 256 种不同的颜色。所以我尝试在我的 vertexShader 中创建一个 const 数组并将 6 个法线放在那里,然后而不是每个顶点使用 3 个字节来存储法线,只使用 1 来存储要查看的索引。但是,这不起作用,因为数组索引只能是常量。我还尝试测试是否 normal = 0 那么该值是 normals[0] 等。但它也不起作用。
我的问题是:如何存储循环数据,然后通过在我的缓冲区中存储索引而不是所述数据来检索它?
编辑:
我忘了提及我有什么行为:
当传递一个“in”变量作为数组的索引时,它会自动转换为 0 索引,当测试“in”的值并分配正确的索引时,我到处都有奇怪的工件。

#version 400

const vec4 normals[6](vec4(1,0,0,0),....)
in int normal;

void main(void){

normals[normal] ---> always returning the first element of the array
}

编辑2:
所以在把glVertexAttribPointer改成glVertexAttribIPointer之后,我还是有很大的工件,所以我把代码和结果贴出来:
调用创建法线 vbo 的方法:

private void storeDataInAttributeList(int attributeNumber, int coordsSize,byte[] data) {
int vboID = GL15.glGenBuffers();
vbos.add(vboID);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,vboID);
ByteBuffer buffer = storeDataInByteBuffer(data);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL30.glVertexAttribIPointer(attributeNumber, coordsSize, GL11.GL_BYTE, 0,0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}

顶点着色器:

#version 400 core

const vec4 normals[] = vec4[6](vec4(1,0,0,0),vec4(0,1,0,0),vec4(0,0,1,0),vec4(-1,0,0,0),vec4(0,-1,0,0),vec4(0,0,-1,0));

in vec3 position;
in vec3 color;
in int normal;

out vec4 color_out;
out vec3 unitNormal;
out vec3 unitLightVector;
out vec3 unitToCameraVector;
out float visibility;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;

uniform float fogDensity;
uniform float fogGradient;

void main(void){

vec4 worldPosition = transformationMatrix * vec4(position,1.0);
vec4 positionRelativeToCam = viewMatrix * worldPosition;

gl_Position = projectionMatrix * positionRelativeToCam;
color_out = vec4(color,0.0);
unitNormal = normalize((transformationMatrix * normals[normal]).xyz);

unitLightVector = normalize(lightPosition - worldPosition.xyz);
unitToCameraVector = normalize((inverse(viewMatrix) * vec4(0.0,0.0,0.0,1.0)).xyz - worldPosition.xyz);

visibility = clamp(exp(-pow(length(positionRelativeToCam.xyz)*fogDensity,fogGradient)),0.0,1.0);
}

结果:
Result
最终编辑:我忘记将 vertexarray 的大小从 3 更改为 1,所以现在一切正常

最佳答案

具有整数数据类型的顶点属性让您指定 glVertexAttribIPointer (专注于 I )而不是 glVertexAttribPointer .见 glVertexAttribPointer .
属性的类型不是由类型参数指定的。 type 参数仅指定源数据数组的类型。由 glVertexAttribPointer 指定的属性数据转换为浮点数。

关于java - GLSL 将循环数据存储在常量数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64076737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com