2016-04-06 54 views
9

ZREDAGOWANEPróbując portu modułu cieniującego GLSL szkła na przetwarzanie 3,0

Jestem początkujący na język shaderów GLSL przetwarzanie i. Próbuję przenieść moduł cieniujący fresnel + cubemap na materiał szklany. Ale jak prowadzić mój kształt kiedykolwiek znikną, zamiast ... :-(

Moja vertex shader jest:

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; 
} 

A fragment shader:

#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); 
} 

jestem testowania tego shader z przetwarzanie 3.0 szkic ryk (edytowany), w trybie Android:

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(); 
} 

I używam obrazów this do zbudowania mapy cubemap.

Ktoś wie, jak mogę to wykonać?

+3

to dużo kodu zwrócić się do nas przejść. Prawdopodobnie będziesz miał więcej szczęścia, jeśli opublikujesz [mcve], zawężając go do jak najmniejszej liczby linii. –

+0

Masz całkowitą rację, przepraszam. Poprzedni post był trochę zagmatwany. Sprawdź moje edytowane pytanie. Odpowiednie części to kod wierzchołka i fragmentu. Dodałem kod szkicu, aby pomóc i oczyścić. Przepraszam, jeśli nadal jest tak wiele linii, ale obawiam się poświęcić trochę przejrzystości, jeśli zmniejszę to bardziej. Dzięki za pomoc i porady, @Kevin Workman. – Renascienza

+0

Czy kiedykolwiek zrozumiałeś to? –

Odpowiedz

1

Problem nie występuje w kodzie, ale w danych.

OpenGL wymaga, aby wszystkie tekstury wykorzystywane przez cubemap mają same wymiary, i że tekstur być kwadratowy inaczej będzie odmówić go załadować.

Sprawdziłem twoje PNG, a tak nie jest, wszystkie mają ten sam wymiar, ale nie są kwadratowe (255x230).

Również dla Androida może być wymagane, aby tekstury wymiary być potęgą liczby 2 (128, 256, 512 ...)

Więc przetestowany rozmiaru wszystkich tekstur do 256x256 pikseli, a teraz swoją próbkę działa:

it works !