johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 19. březen 2010, 11:04:53 Předmět: glsl 1.5, glLinkProgram |
|
|
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);
}
}
|
|
|
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 19. březen 2010, 13:16:07 Předmět: |
|
|
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. |
|