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

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

Cg Shader Compile/D3DX9 Shader Comipile->разный ASM код.Use Cg D3DXAssembleShader -> error X5326: Read of uninitialized components(*) in v0: *x/0 *y/1 z/2 w/319 янв. 200720:16#0
Привет всем!!!
решил внедрять в движок менеджер шейдеров. При иcпользовании Cg, создаю программу CgCreateProgram, получаю asm код и передаю в D3DXAssembleShader вылетает ошибка error X5326: Read of uninitialized components(*) in v0: *x/0 *y/1 z/2 w/3.
Если сразу сделать через D3DXCompileShader, минуя Cg все ок.
итак сам шейдер(простейший из учебника по Cg)
// This is C2E1v_green from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard.  See page 38.

struct C2E1v_Output {
  float4 position : POSITION;
  float3 color    : COLOR;
};

C2E1v_Output C2E1v_green(float2 position : POSITION)
{  
  C2E1v_Output OUT;

  OUT.position = float4(position,0,1);
  OUT.color = float3(0,1,0);

  return OUT;  
}
далее:
// ставлю минимум для этого шейдера
cgVertexProfile = CG_PROFILE_VS_1_1;
// создаю программу из строки с шейдером
cgVertexProgram = cgCreateProgram(
      cgContext,              /* Cg runtime context */
      CG_SOURCE,                /* Program in human-readable form */
  SourceShader,  /* Name of file containing program */
      cgVertexProfile,        /* Profile: OpenGL ARB vertex program */
      vertexProgramName,      /* Entry function name */
      NULL);             /* Pass optimal compiler options */
// получаю asm код шейдера
std::string code = cgGetProgramString(cgVertexProgram, CG_COMPILED_PROGRAM);
// выводим в отладку результирующий код.
OutputDebugString(code.c_str());
ID3DXBuffer *buffer = NULL;
ID3DXBuffer *shader = NULL;
// создаем шейдер
HRESULT hr = D3DXAssembleShader(code.c_str(), 
            code.size(), 
            NULL, 
            NULL, 
            0,
            &shader,
            &buffer);

if (buffer) {
// выводим отладку ошибку.
  OutputDebugString(static_cast<const char*>(buffer->GetBufferPointer()));
  buffer->Release();
  buffer = NULL;
}
итак в строке code такое содержание:
vs_1_1
// cgc version 1.5.0014, build date Sep 18 2006 20:41:01
// command line args: -q -profile vs_1_1 -entry C2E1v_green
//vendor NVIDIA Corporation
//version 1.5.0.14
//profile vs_1_1
//program C2E1v_green
//var float2 position : $vin.POSITION : ATTR0 : 0 : 1
//var float4 C2E1v_green.position : $vout.POSITION : HPOS : -1 : 1
//var float3 C2E1v_green.color : $vout.COLOR : COL0 : -1 : 1
//const c[0] = 0 1
def c0, 0.000000, 1.000000, 0, 0
mov oD0.xyz, c0.xyxw
mov oPos.xy, v0
mov oPos.zw, c0.xyxy
Ошибка создания шейдера гласит так:
(14): error X5326: Read of uninitialized components(*) in v0: *x/0 *y/1 z/2 w/3

Если миновать Cg и создать шейдер через компилятор D3DX, код:

Profile = "vs_1_1";
HRESULT hr = S_OK;
// компилируем шейдер
hr = D3DXCompileShader(SourceShader, 
  _Shader.size(), 
  NULL, 
  NULL,
  vertexProgramName, 
  Profile,
  0,
  &shader,
  &buffer,
  NULL);
ID3DXBuffer *asmCode = NULL;
// дизассемблируем шейдер
D3DXDisassembleShader(static_cast<const DWORD *>(shader->GetBufferPointer()), FALSE, NULL, &asmCode);
if (asmCode) {
// выводим код в отладку
  OutputDebugString(static_cast<const char *>(asmCode->GetBufferPointer()));
  asmCode->Release();
}

то в результате asm код будет выглядеть так:
//
// Generated by Microsoft (R) D3DX9 Shader Compiler 9.12.589.0000
    vs_1_1
    def c0, 1, 0, 0, 0
    dcl_position v0
    mad oPos, v0.xyxx, c0.xxyy, c0.yyyx
    mov oD0.xyz, c0.yxyw

// approximately 2 instruction slots used
Как видно код на выходе разный.
Cg самый последний 1.5.
Как заставить создавать шейдеры, после компиляции Cg в asm, используя D3DXAssembleShader ?
Что я делаю не так?
Спасибо всем заранее. С Уважением Андрей.

Генератор шумовой текстуры для воды19 янв. 200719:53#10
dmikos
Спасибо!!
угу пригодится...
HLSL: Преломление изображения проходящего через стекло.19 янв. 200719:42#4
Scart
Круто спасибо за пример...
Баг: растеризация линии.15 янв. 200717:57#3
IROV..
я в тестовом проекте все ок? просто если много всего в общем проекте то небольшая скрытая ошибка может привести к странным ошибкам типа той что у тебя (разные DIP'ы баг, 1 DIP все ок).
а если через DrawPrimitiveUP ?
Попадание куба во frustum - кто может помочь?12 янв. 200722:33#5
NE_Mashinist
мало почему не знаю :(, в книжке Борескова написано про этот метод оптимизации.
Попадание куба во frustum - кто может помочь?12 янв. 200721:15#2
Хозяин
в идеальном случае достаточно двух т.е. минимально и максимально удаленной относительно каждой плоскости пирамиды видимости.
Roma75
http://www.pmg.org.ru/nehe/nehex2.htm
у меня работает и для OpenGL и для Direct3D. но код модифицирован с учетом оптимизации проверки.
Компиляция HLSL шейдеров. Баги.12 янв. 200720:30#2
функция normalize дотупна только в пиксельном шейдере версии начина я с 2.0 поэтому ты не сможешь получить
длину вектора даже вручную вызвав sqrt так как и эта функция доступна только в 2.0. так что твой шейдер не скомпилится с профилем ниже 2.0
На твоем месте я бы попробовал вручную приближенно вычислить корень, а потом наормализовать вектор.
Я смотрю ты видать бамп, делаешь наверное проблемы с вычислением  или хранением Tangent  и Binormal  ? может лучше в формате вершин это предусмотреть?
Компиляция HLSL шейдеров. Баги.12 янв. 200720:17#1
mocia
ща прогнал на GPU Shader Analyser
все скомпилилось только вот объявить переменную текстурного семплера надо:
sampler2D g_samNormalMap;

//Пиксельный шейдер
float4 PixScenePS( //float4 Diffuse    : COLOR0,
                  //float2 Tex0      : TEXCOORD0,
                  float2 Tex1      : TEXCOORD0,
                  float3 Normal    : TEXCOORD1,
                  float3 Tangent    : TEXCOORD2,
                  float3 Binormal  : TEXCOORD3,
                  float4 ViewPos    : COLOR0) : COLOR0
{
    float3 N = tex2D( g_samNormalMap, Tex1 );
    N = (N * 2) - 1;

    float3 x = {1,0,0}; //если поставить 0,0,0, то компилится...
    float3x3 mTangentFrame = { Tangent, Binormal, Normal };
    N = normalize(mul( x, mTangentFrame )); //на эту строку ругается

    float4 f =  float4(N[0],N[1],N[2],0);

    return f;
} 
STL утечки памяти10 янв. 200720:00#9
Nikifor
далее лишняя строчка strcpy добавит терминирующий ноль сама.
...
BufferMaterial->pTextureFilename[strlen(pMaterial[i].pTextureFilename)] = 0;
...
лучше укоротить
for(int i=0; i<(int)vMaterials.size(); i++)
    SAFE_DELETE_ARRAY(vMaterials[i]->pTextureFilename);

  vector<D3DXMATERIAL*>::iterator Iterator;
  while(!vMaterials.empty())
  {
    Iterator = vMaterials.begin();
    delete *Iterator;
    vMaterials.erase(Iterator);
  }
на
  vector<D3DXMATERIAL*>::iterator Iterator;
  while(!vMaterials.empty())
  {
    Iterator = vMaterials.begin();
SAFE_DELETE_ARRAY(Iterator->pTextureFilename);
    delete *Iterator;
    vMaterials.erase(Iterator);
  }
ну так вроде все нормально...
pMaterialBuffer вызываешь Release ? я так понимаю это ID3DXBuffer ?
проблема с расширениями GL10 янв. 200719:20#4
olegf
попробуй http://glew.sourceforge.net/
glewInit() и все расширения подключены....
CG и VBO10 янв. 200719:12#1
Crio
дак вроде в вершинный шейдер и поступает текущая вершина для обработки или я не так понял ? вот из этого нужно скакать.
STL утечки памяти10 янв. 200719:10#6
Nikifor
попробуй вот так:
#ifdef _WIN32
//memory leak
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
....

//Точка входа в программу
int __stdcall WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInstance, 
           char* lpCmdLine, int nWinMode)
{
//запускаем мемори-лик трассировку:
#ifdef _DEBUG  
      //устанавливаем брейкпоинт на утечку памяти
    //_CrtSetBreakAlloc(16022);
  //устанавливаем параметры отлова мемори-ликов
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    HANDLE hLogFile = CreateFile(
               "memory_leaks.log",
               GENERIC_WRITE,
               FILE_SHARE_WRITE, 
               NULL,
               CREATE_ALWAYS,
               FILE_ATTRIBUTE_NORMAL,
               NULL);

        _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);

        _CrtSetReportFile(_CRT_WARN, hLogFile);

        _RPT0(_CRT_WARN, "Memory leak logging start...\n");
//закрывать открытый файл не надо, пусть сам закрывается после того, как туда попадет мемори-лик информация    
    _CrtMemState startMemState;
    _CrtMemState endMemState;
    _CrtMemCheckpoint( &startMemState );
#endif
вот так у меня все работает... раскоментируешь строчку _CrtSetBreakAlloc и найдешь место утечки.
STL утечки памяти10 янв. 200718:45#4
Nikifor
так если я правильно понял то если это средство работает правильно то тебе нужно выставить адрес где утечка а потом через Call Stack в Debug найти место вызова.
где-то в подсказках это было.

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

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