.[ ČeskéHry.cz ].
glsl 1.5, glLinkProgram

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 19. březen 2010, 11:04:53    Předmět: glsl 1.5, glLinkProgram Odpovědět s citátem

Zdravim tak opet mam dalsi problem s shaderama.
Mam tento geometry shader. Problem je ze pokud odkomentuju jakykoliv radek s MakeTri tak pri linkovani shaderu se beh programu zastavi na glLinkProgram.
Zkouseno na ATI catalyst 10.2 i 10.3a. Shader se skompiluje bez chyb.
kód:

#version 150
#extension GL_EXT_geometry_shader4 : enable

precision highp float;
precision highp int;

layout(lines_adjacency) in;
layout(triangle_strip, max_vertices = 24) out;

const int HEIGHT_MAP_SIZE = 1025;
const int SPACING = 15;
const int BLOCK_SIZE = 129;

const float HM_FULL_SPACING      = HEIGHT_MAP_SIZE * SPACING;
const float HM_FULL_SPACING_HALF = 0.5* HEIGHT_MAP_SIZE * SPACING;

// Jak casto se ma textura opakovat
const float TEXTURE_TILE_REPEAT_COEF = 40.0;

// Uniforms
uniform usampler2D texture_heightmap;

uniform int blockXPos;
uniform int blockZPos;

uniform int LOD;

flat in ivec2 vertIndex[4];
smooth centroid out vec4 g_color;

smooth centroid out vec2 texCoord_textures;
smooth centroid out vec2 texCoord_normalmap;

smooth centroid out float actualHeight;

void EmitMyVertex(vec4 v)
{
   
   texCoord_normalmap = (v.xz+HM_FULL_SPACING_HALF)/HM_FULL_SPACING;
   texCoord_textures = TEXTURE_TILE_REPEAT_COEF*texCoord_normalmap;
   actualHeight = v.y;
   gl_Position = gl_ProjectionMatrix*gl_ModelViewMatrix*v;   
   EmitVertex();

}

void makeTri(vec4 v0, vec4 v1, vec4 v2)
{
   EmitMyVertex(v0);
   EmitMyVertex(v1);
   EmitMyVertex(v2);
   EndPrimitive();
}

void main(void)
{
   int step = 1 << LOD;


   int ix = vertIndex[0].x;
   int iy = vertIndex[0].y;


   // STAVBA TROJUHELNIKU
   // 0---1 0---1          ix---iy  iy---2
    // | \ | | \ |  ....     | \ |    | \ |
    // 3---2 3---2           3---2   ix---3
   //
   g_color = vec4(1.0,1.0,1.0,1.0);
   makeTri(gl_PositionIn[0],gl_PositionIn[1],gl_PositionIn[2]);
   makeTri(gl_PositionIn[0],gl_PositionIn[2],gl_PositionIn[3]);

   // Odvodit od maximalni screen space chyby bloku
   // Asi od maximalniho lodu, v opacnem pripade bysme sice usetrili par pixelu,
   //   ale musime posilat do shaderu vic chyb (chyba na kazdy lod)
   const float Y_SHIFT = -50.0;

   // HORNI
   if (iy == 0)
   {
      vec4 nextVertex = gl_PositionIn[0];
      vec4 nextVertex2 = gl_PositionIn[1];
      nextVertex.y += Y_SHIFT;
      nextVertex2.y += Y_SHIFT;
      g_color = vec4(1.0,1.0,1.0,1.0);
      makeTri(gl_PositionIn[0],gl_PositionIn[1],nextVertex);
      makeTri(nextVertex,gl_PositionIn[1],nextVertex2);
   }
   

   // DOLNI
   if (iy == BLOCK_SIZE-step-1)
   {
      vec4 nextVertex = gl_PositionIn[3];
      vec4 nextVertex2 = gl_PositionIn[2];
      nextVertex.y += Y_SHIFT;
      nextVertex2.y += Y_SHIFT;
      g_color = vec4(1.0,1.0,1.0,1.0);
      makeTri(gl_PositionIn[3],gl_PositionIn[2],nextVertex);
      makeTri(nextVertex,gl_PositionIn[2],nextVertex2);
   }


   // LEVY
   if (ix == 0)
   {
      vec4 nextVertex = gl_PositionIn[0];
      vec4 nextVertex2 = gl_PositionIn[3];
      nextVertex.y += Y_SHIFT;
      nextVertex2.y += Y_SHIFT;
      g_color = vec4(1.0,1.0,1.0,1.0);
      //makeTri(gl_PositionIn[0],gl_PositionIn[3],nextVertex);
      //makeTri(nextVertex,gl_PositionIn[3],nextVertex2);
   }
   
   // PRAVY
   if (ix == BLOCK_SIZE-step-1)
   {
      vec4 nextVertex = gl_PositionIn[2];
      vec4 nextVertex2 = gl_PositionIn[1];
      nextVertex.y += Y_SHIFT;
      nextVertex2.y += Y_SHIFT;
      g_color = vec4(1.0,1.0,1.0,1.0);
      //makeTri(gl_PositionIn[2],gl_PositionIn[1],nextVertex);
      //makeTri(nextVertex,gl_PositionIn[1],nextVertex2);
   }
}


Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 19. březen 2010, 13:16:07    Předmět: Odpovědět s citátem

Dalsi krasna vec, tyhle dva kody davaji naprosto odlisne vysledky.
kód:

   int b = 0;
   makeTri(gl_PositionIn[b],gl_PositionIn[1],gl_PositionIn[2]);

kód:

   makeTri(gl_PositionIn[0],gl_PositionIn[1],gl_PositionIn[2]);


Pri
kód:

   int b = 2;
   makeTri(gl_PositionIn[b],gl_PositionIn[1],gl_PositionIn[2]);

dostavam unexpected error.

Mam pocit ze je neco hodne spatne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 19. březen 2010, 14:46:21    Předmět: Odpovědět s citátem

Reportuj bug na devrel@ati.com (nebo já nevím, jakou teď mají adresu)
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 19. březen 2010, 15:08:12    Předmět: Odpovědět s citátem

Hm no toho jsem se bal, doufal jsem ze tam mam nejakou hloupou chybu.
Presto dik
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna