Ergebnis 1 bis 4 von 4
  1. #1
    m1au ist offline Eroberer
    registriert
    24-10-2015
    Beiträge
    69

    Gouraud shading

    Hallo

    Ich habe eine Frage zum Vertex-Shader von Android Lesson Two: Ambient and Diffuse Lighting | Learn OpenGL ES
    Code:
    final String vertexShader =
        "uniform mat4 u_MVPMatrix;      \n"     // A constant representing the combined model/view/projection matrix.
      + "uniform mat4 u_MVMatrix;       \n"     // A constant representing the combined model/view matrix.
      + "uniform vec3 u_LightPos;       \n"     // The position of the light in eye space.
     
      + "attribute vec4 a_Position;     \n"     // Per-vertex position information we will pass in.
      + "attribute vec4 a_Color;        \n"     // Per-vertex color information we will pass in.
      + "attribute vec3 a_Normal;       \n"     // Per-vertex normal information we will pass in.
     
      + "varying vec4 v_Color;          \n"     // This will be passed into the fragment shader.
     
      + "void main()                    \n"     // The entry point for our vertex shader.
      + "{                              \n"
    // Transform the vertex into eye space.
      + "   vec3 modelViewVertex = vec3(u_MVMatrix * a_Position);              \n"
    // Transform the normal's orientation into eye space.
      + "   vec3 modelViewNormal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));     \n"
    // Will be used for attenuation.
      + "   float distance = length(u_LightPos - modelViewVertex);             \n"
    // Get a lighting direction vector from the light to the vertex.
      + "   vec3 lightVector = normalize(u_LightPos - modelViewVertex);        \n"
    // Calculate the dot product of the light vector and vertex normal. If the normal and light vector are
    // pointing in the same direction then it will get max illumination.
      + "   float diffuse = max(dot(modelViewNormal, lightVector), 0.1);       \n"
    // Attenuate the light based on distance.
      + "   diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));  \n"
    // Multiply the color by the illumination level. It will be interpolated across the triangle.
      + "   v_Color = a_Color * diffuse;                                       \n"
    // gl_Position is a special variable used to store the final position.
    // Multiply the vertex by the matrix to get the final point in normalized screen coordinates.
      + "   gl_Position = u_MVPMatrix * a_Position;                            \n"
      + "}
    Dort wird u_MVMatrix nicht nur zum Transformieren von Vertices, sondern auch zum Transformieren von Normalen verwendet.

    Kann das wirklich stimmen?

  2. #2
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.760

    AW: Gouraud shading

    Ich hab' jetzt davon eigentlich keine Ahnung, aber wenn die Variable die Projektionsmatrix darstellt, kann man sie natürlich für alles, was mit der gleichen Projektion angezeigt werden soll, verwendet werden.

  3. #3
    m1au ist offline Eroberer
    registriert
    24-10-2015
    Beiträge
    69

    AW: Gouraud shading

    Meines Wissens nach muss man Vertices und Vertex-Normalen unterschiedlich transformieren. Und zwar die Normalen mit der invers transposen Matrix, die für die Vertices verwendet wird. Das scheint aber hier nicht der Fall zu sein. Entweder hat der Autor die Matrix zur Transformation der Normalen schlichtweg vergessen, oder er macht hier irgendwas, was ich nicht verstehe.

  4. #4
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.760

    AW: Gouraud shading

    Erzeugt der Code denn das richtige Ergebniss?

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •