gpt4 book ai didi

glsl - 尝试将 GLSL 玻璃着色器移植到Processing 3.0

转载 作者:行者123 更新时间:2023-12-03 05:43:15 26 4
gpt4 key购买 nike

已编辑

我是处理语言和 GLSL 着色器的初学者。我正在尝试为玻璃 Material 移植菲涅耳+立方体贴图着色器。但结果我的形状消失了,相反......:-(

我的顶点着色器是:

const float Air = 1.0;
const float Glass = 1.51714;

const float Eta = Air / Glass;

const float R0 = ((Air - Glass) * (Air - Glass)) / ((Air + Glass) * (Air + Glass));

uniform mat4 transform;
uniform mat4 modelview;
uniform mat3 normalMatrix;

attribute vec4 vertex;
attribute vec3 normal;

varying vec3 v_reflection;
varying vec3 v_refraction;
varying float v_fresnel;

void main(void){

vec4 t_vertex = modelview * vertex;

vec3 incident = normalize(vec3(t_vertex));

vec3 t_normal = normalMatrix * normal;

v_refraction = refract(incident, t_normal, Eta);
v_reflection = reflect(incident, t_normal);

v_fresnel = R0 + (1.0 - R0) * pow((1.0 - dot(-incident, t_normal)), 5.0);

gl_Position = transform * t_vertex;
}

以及片段着色器:

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

uniform samplerCube cubemap;

varying vec3 v_refraction;
varying vec3 v_reflection;
varying float v_fresnel;

void main(void){
vec4 refractionColor = textureCube(cubemap, normalize(v_refraction));
vec4 reflectionColor = textureCube(cubemap, normalize(v_reflection));

gl_FragColor = mix(refractionColor, reflectionColor, v_fresnel);
}

我正在 Android 模式下使用下面的处理 3.0 草图(编辑)测试此着色器:

PShader shader;
PShape sphere;

void setup() {
fullScreen(P3D);
noStroke();

shader = loadShader("glass.frag.glsl", "glass.vert.glsl");
openCubeMap("posx.png", "negx.png", "posy.png", "negy.png", "posz.png", "negz.png");
shader.set("cubemap", 1);

sphere = createShape(SPHERE, 120);
sphere.setFill(color(-1, 50));
}

void draw() {
background(0);

directionalLight(102, 102, 102, 0, 0, -1);
lightSpecular(204, 204, 204);
directionalLight(102, 102, 102, 0, 1, -1);
specular(100, 150, 150);

translate(width / 2, height / 2);
shader(shader);
shape(sphere);
}

void openCubeMap(String posX, String negX, String posY, String negY, String posZ, String negZ) {

PGL pgl = beginPGL();
// create the OpenGL-based cubeMap
IntBuffer envMapTextureID = IntBuffer.allocate(1);
pgl.genTextures(1, envMapTextureID);
pgl.activeTexture(PGL.TEXTURE1);
pgl.enable(PGL.TEXTURE_CUBE_MAP);
pgl.bindTexture(PGL.TEXTURE_CUBE_MAP, envMapTextureID.get(0));
pgl.texParameteri(PGL.TEXTURE_CUBE_MAP, PGL.TEXTURE_WRAP_S, PGL.CLAMP_TO_EDGE);
pgl.texParameteri(PGL.TEXTURE_CUBE_MAP, PGL.TEXTURE_WRAP_T, PGL.CLAMP_TO_EDGE);
pgl.texParameteri(PGL.TEXTURE_CUBE_MAP, PGL.TEXTURE_WRAP_R, PGL.CLAMP_TO_EDGE);
pgl.texParameteri(PGL.TEXTURE_CUBE_MAP, PGL.TEXTURE_MIN_FILTER, PGL.LINEAR);
pgl.texParameteri(PGL.TEXTURE_CUBE_MAP, PGL.TEXTURE_MAG_FILTER, PGL.LINEAR);

//Load in textures
String[] textureNames = { posX, negX, posY, negY, posZ, negZ };
for (int i=0; i<textureNames.length; i++) {
PImage texture = loadImage(textureNames[i]);
int w = texture.width;
int h = texture.height;
texture.loadPixels();
pgl.texImage2D(PGL.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, PGL.RGBA, w, h, 0, PGL.RGBA, PGL.UNSIGNED_BYTE, IntBuffer.wrap(texture.pixels));
}

endPGL();
}

我正在使用 this用于构建立方体贴图的图像。

有人知道我如何才能做到这一点吗?

最佳答案

问题不在于您的代码,而在于您的数据。

OpenGL 要求立方体贴图使用的所有纹理具有相同的尺寸,并且纹理是方形,否则它将拒绝加载它。

我检查了你的 PNG,情况并非如此,它们都有相同的尺寸,但不是正方形 (255x230)。

对于 Android,可能还要求纹理尺寸为 2 的幂(128、256、512 ...)

所以我测试了将所有纹理大小调整为 256x256 像素,现在您的示例可以正常工作:

it works !

关于glsl - 尝试将 GLSL 玻璃着色器移植到Processing 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36444975/

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