Java Opengl: Rejet de l'arrière-plan de Texture avec des Shaders


J'essaie de suivre ce tutoriel pour supprimer la couleur d'arrière-plan de la texture avec un shader. https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/discard.php

Tout fonctionne correctement, j'ai copié le code du shader directement à partir du tutoriel, mais le fragment shader génère plusieurs erreurs.

sampler2D myTexture;
           varying vec2 vTexCoord;
void main (void) 
{  
   vec4 color = texture2D(myTexture, vTexCoord); 

    if (color.rgb == vec3(1.0,0.0,0.0))
      discard; 

   gl_FragColor = color;
}

ERREUR: 0: 3: 'sampler2D': les échantillonneurs doivent être uniformes
ERREUR: 0: 7:' myTexture': identifiant non déclaré
ERREUR: 0: 7: 'vTexCoord': non déclaré identifiant
ERREUR: 0: 7: 'texture2D' : aucune fonction surchargée correspondante trouvée (en utilisant la conversion implicite)
ERREUR: 0: 7:'=': impossible de convertir de 'const float' en 'vecteur à 4 composants de float'

J'ai remplacé les identifiants non déclarés par ma texture et Vec2, mais ils restent non identifiés. Je suppose qu'ils doivent être chargés en quelque sorte.

C'est probablement ce qui lance alors le "no no matching surchargé..." erreur. Les deux autres je ne comprends pas, le code est directement d'après le tutoriel, il ne devrait donc pas y avoir de tels problèmes, en théorie.

Ma version lwjgl est 2.9.1

Voici la source pertinente:

    shaderProgram = glCreateProgram();
    vertexShader  = glCreateShader(GL_VERTEX_SHADER);
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    StringBuilder vertexShaderSource   = new StringBuilder();
    StringBuilder fragmentShaderSource = new StringBuilder();

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.vert"));
        String line;
        line = reader.readLine();

        while(line != null){
            line = reader.readLine();

            if(line != null){
                vertexShaderSource.append(line).append('\n');
            }
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Vertex no load.");
        Display.destroy();
        System.exit(1);
    }

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.frag"));
        String line;
        //line = reader.readLine();

        while(true){
            line = reader.readLine();

            if(line == null){
                break;
            }

            fragmentShaderSource.append(line).append('\n');
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Frag no load.");
        Display.destroy();
        System.exit(1);
    }
    System.out.println(fragmentShaderSource);

    glShaderSource(vertexShader, vertexShaderSource);
    glCompileShader(vertexShader);
    if(glGetShader(vertexShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("Vertex no compile");
    }
    glShaderSource(fragmentShader, fragmentShaderSource);
    glCompileShader(fragmentShader);
    if(glGetShader(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("frag no compile");
    }

    System.out.println("Shader.frag Error Log\n" + glGetShaderInfoLog(fragmentShader, 1024));

    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glValidateProgram(shaderProgram);
Author: dunworray, 2015-07-24

1 answers

Les variables uniformes dans GLSL doivent commencer par le mot-clé uniform. Donc, pour tout réparer, remplacez la première ligne par

uniform sampler2D myTexture;
 1
Author: BDL, 2015-07-24 19:56:15