GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (44 стр.)

Сообщения на форуме пользователя Andrey (44 стр.)

Раскрытие циклов в Cg20 авг. 201014:24#35
innuendo
да. Вообще X600 карта а не X300
Раскрытие циклов в Cg20 авг. 201012:31#33
innuendo
драйвер как раз свежий.
Раскрытие циклов в Cg20 авг. 201012:08#31
innuendo
Не могу. Нету карты той. И ничего ты не сможешь по логу понять. Еще раз - причина не пишется.
Раскрытие циклов в Cg20 авг. 201011:57#29
innuendo
>пустой infoLog что-ли ?
еще раз: Пишет не могу слинковать, что-то типа Failed to linked.
Раскрытие циклов в Cg20 авг. 201011:49#27
innuendo
ошибка линковки и все. Причины не указано. Хотя ошибки компиляции пишутся если что.
Оптимизация софтового рендера.20 авг. 201011:25#9
tmtlib
На C переписывай. Быстрей будет. FPS 18-46.
Раскрытие циклов в Cg20 авг. 201011:21#25
innuendo
>и фрагментный компилился без ошибок ?
естественно.
Раскрытие циклов в Cg20 авг. 201011:03#23
innuendo
вершинный
#version 120

const int g_iNumSplits = 4;

uniform mat4 lightMatrix[g_iNumSplits];
uniform mat4 cameraModelViewMatrixInverse;
uniform vec3 lightdir1;
varying vec4 vTexCoord[g_iNumSplits];
varying vec4 lpos;

varying float lightShadows;
varying vec2 texCoord;


void main(void)
{
  mat4 worldMatrix = cameraModelViewMatrixInverse * gl_ModelViewMatrix;
  vec4 vWorldPos = worldMatrix * gl_Vertex;
  
  lpos = gl_ModelViewProjectionMatrix * gl_Vertex;
  vTexCoord[0] = lightMatrix[0] * vWorldPos;
  vTexCoord[1] = lightMatrix[1] * vWorldPos;
  vTexCoord[2] = lightMatrix[2] * vWorldPos;
  vTexCoord[3] = lightMatrix[3] * vWorldPos;
     
  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

  //lightShadows = clamp(dot(lightdir1,normalize(mat3(worldMatrix) * gl_Normal) ), 0.0, 1.0); //max(dot( gl_Normal, lightdir1 ),0.0);
  mat3 world = mat3(worldMatrix[0].xyz, worldMatrix[1].xyz, worldMatrix[2].xyz);
  lightShadows = max(dot(lightdir1,normalize(world * gl_Normal)), 0.0);
  
  texCoord = gl_MultiTexCoord0.st;
  gl_FrontColor = gl_Color;
}
пиксельный:
#version 120

const int g_iNumSplits = 4;
uniform sampler2DShadow shadowMap[g_iNumSplits];

varying vec4 vTexCoord[g_iNumSplits];
varying vec4 lpos;

varying float lightShadows;

varying vec2 texCoord;
uniform sampler2D texSampler;
uniform float shadow_strength;
uniform float split_planes[g_iNumSplits];

// This define the value to move one pixel left or right
uniform float xPixelOffset ;

// This define the value to move one pixel up or down
uniform float yPixelOffset ;

uniform int use_color;
uniform int use_texture;
uniform int use_lighting;


float lookup( vec2 offSet)
{
  return shadow2DProj(shadowMap[g_iNumSplits-4], vTexCoord[g_iNumSplits-4] + vec4(offSet.x*vTexCoord[g_iNumSplits-4].w*xPixelOffset, offSet.y*vTexCoord[g_iNumSplits-4].w*yPixelOffset, 0.0, 0.0) ).x;
}

float PCF_Filter()
{
  float shadow = 0.0; 
  
  shadow += lookup(vec2(-1.5,-1.5));
  shadow += lookup(vec2(-0.5,-1.5));
  shadow += lookup(vec2(0.5,-1.5));
  shadow += lookup(vec2(1.5,-1.5));
    
  shadow += lookup(vec2(-1.5,-0.5));
  shadow += lookup(vec2(-0.5,-0.5));
  shadow += lookup(vec2(0.5,-0.5));
  shadow += lookup(vec2(1.5,-0.5));
      
  shadow += lookup(vec2(-1.5,0.5));
  shadow += lookup(vec2(-0.5,0.5));  
  shadow += lookup(vec2(0.5,0.5));
  shadow += lookup(vec2(1.5,0.5));
        
  shadow += lookup(vec2(-1.5,1.5));
  shadow += lookup(vec2(-0.5,1.5));
  shadow += lookup(vec2(0.5,1.5));
  shadow += lookup(vec2(1.5,1.5));
  
  return shadow*0.0625;
}

void main (void)
{

  float shadow;
  if ( lpos.z < split_planes[g_iNumSplits-4] ) {
    shadow = PCF_Filter();
  }
  else if ( lpos.z < split_planes[g_iNumSplits-3] ) {
    shadow = shadow2DProj(shadowMap[g_iNumSplits-3], vTexCoord[g_iNumSplits-3]).x;
  }
  else if ( lpos.z < split_planes[g_iNumSplits-2] ) {
    shadow = shadow2DProj(shadowMap[g_iNumSplits-2], vTexCoord[g_iNumSplits-2]).x;
  } else {
    shadow = shadow2DProj(shadowMap[g_iNumSplits-1], vTexCoord[g_iNumSplits-1]).x;
  }

  shadow = min(shadow + shadow_strength,1.0);
  
  vec4 color;
  if ( use_lighting != 0 ) 
  {
    vec4 diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
    vec4 ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
    vec4 globalAmbient = gl_LightModel.ambient * gl_FrontMaterial.ambient;
    if ( use_color == 0 )
    {
      color = ( lightShadows * shadow + ambient + globalAmbient );
    }
    else  
    {
      color = lightShadows * diffuse * shadow + ambient + globalAmbient;
    }
  } else
  {
    if ( use_color == 0 )
    {
      color = vec4(shadow,shadow,shadow,1.0);
    } else
    {
      color = gl_FrontMaterial.ambient * shadow;
    }
  }
  color.w = gl_FrontMaterial.diffuse.w;
  if ( use_texture != 0 )
  {
    vec4 texture = texture2D( texSampler, texCoord);
    color *= texture;  
  }
  gl_FragColor = color;
}
Если убирать PCF то все линкуется. Не занимался ни оптимизаций ни убиранием ветвлений, по крайней мере пару ветвлений можно убрать, Разбив на 2 шейдера и ставить их в зависимости от задачи. Не знаю верное ли это решение.
Раскрытие циклов в Cg19 авг. 201023:58#20
innuendo
> это glsl выхлоп от Cg ? тогда вопросов нету :)
нет это был шейдер на GLSL написанный другим человеком. На всех картах выше sm 2.0 он линковался.
SetRenderTarget, ошибка19 авг. 201018:46#3
beetlewar
включай DX Debug на полный уровень, смотри Debug Output окно под отладчиком.
Раскрытие циклов в Cg19 авг. 201018:41#15
innuendo
> странно, обычно сначала в таком случае не компилится
как раз написал что оба шейдеры скомпилированы успешно. А вот линковка не удалась, причины непонятны...
Убогая поддержка API :)
Раскрытие циклов в Cg19 авг. 201017:02#13
innuendo
> а про циклы что посоветуешь ?
Вот тут я не спец... ATI вообще иногда выдает не информативный лог линковки GLSL шейдеров... Не линкуется и все. А причина не пишется. Столкнулся с такой ситуацией недавно Тоже было много кода в пиксельном шейдере X600 отказался линковать.
Igor'
> Тоесть сразу 2 компиляции за один шейдер? Толсто...
ну и что? зато универсально :) HLSL шейдера можно подсовывать.
Раскрытие циклов в Cg19 авг. 201016:44#10
Neptune
>При этом шейдер компилится, но как-то странно: код на Cg переводится в длиннющий код на GLSL, а с раньше получался код на ассемблере. Может его надо загружать как-то >хитро? Загрузка из файла через cgCreateProgramFromFile() проходит нормально, но cgGLLoadProgram() выдаёт вот эту ошибку.
>Раз уж на то пошло, не проще ли мне писать шейдеры сразу на GLSL? Cg ведь можно юзать для компиляции на ходу GLSL шейдеров? Или в чистом GLSL тоже есть возможность >рантайм компиляции плюс профили?
Забей на CgGL Run Time. Попробуй взять GLSL код используя  cgGetProgramString(сgProgram, CG_COMPILED_PROGRAM);
Далее сам его компиль, линкуй. Если напрямую заработает значит глючит, Cg Run Time, на nVidia форуме нужно попинать разработчиков.
SetRenderTarget, ошибка19 авг. 201014:05#1
beetlewar
>Есть какие-нибудь догадки, в чем может быть проблема?
DX Debug + DXGetErrorDescription
Раскрытие циклов в Cg19 авг. 201010:42#6
Neptune
>На opengl.org нашел пост о том, что ATI вообще ничего не поддерживают, кроме CG_PROFILE_ARBFP1
> Складывается ощущение, что надо переходить на GLSL или HLSL :(
Дай ссылку на пост, что за народ странный. Одно дело то что выдает Cg Run Time для удобства используемого профиля, другое дело то что поддерживается вообще. Выкинь функцию cgGLGetLatestProfile и не используй ее, смотрю она тупо путает разработчиков. Сейчас из профилей самый ходовой CG_PROFILE_GLSLV и CG_PROFILE_GLSLV так что на остальные можно забить уже давно, кроме конечно же еще более современных профилей типа геометрические шейдеры и т.д.
Делаешь так:
        CGprofile pixelProfile = CG_PROFILE_UNKNOWN;
        CGprofile vertexProfile = CG_PROFILE_UNKNOWN;
  if (cgIsProfileSupported(CG_PROFILE_GLSLV)) {
    vertexProfile = CG_PROFILE_GLSLV;
  }
  else if (cgIsProfileSupported(CG_PROFILE_ARBVP1)) {
    vertexProfile = CG_PROFILE_ARBVP1;
  }
  if (cgIsProfileSupported(CG_PROFILE_GLSLF)) {
    pixelProfile = CG_PROFILE_GLSLF;
  }
  else if (cgIsProfileSupported(CG_PROFILE_ARBFP1)) {
    pixelProfile = CG_PROFILE_ARBFP1;
  }
// используем дальше pixelProfile и vertexProfile 
Теперь у тебя будет лучшей профиль для компиляции на любой видеокарте. Ну по крайней мере не ниже уровня SM 2.0 (минимум ATI 9550,  nVidia FX 5200)

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр