Сообщения на форуме пользователя 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/3 | 19 янв. 2007 | 20: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)
далее:
итак в строке code такое содержание:
Ошибка создания шейдера гласит так:
Как видно код на выходе разный.
Cg самый последний 1.5.
Как заставить создавать шейдеры, после компиляции Cg в asm, используя D3DXAssembleShader ?
Что я делаю не так?
Спасибо всем заранее. С Уважением Андрей.
решил внедрять в движок менеджер шейдеров. При и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; }
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, код:
то в результате 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 янв. 2007 | 19:53 | #10 |
---|
dmikos
Спасибо!!
угу пригодится...
Спасибо!!
угу пригодится...
HLSL: Преломление изображения проходящего через стекло. | 19 янв. 2007 | 19:42 | #4 |
---|
Scart
Круто спасибо за пример...
Круто спасибо за пример...
Книга Грег Снук 3D- ландшафты в реальном времени на C++ и DirectX 9 | 15 янв. 2007 | 17:58 | #18 |
---|
pavkin
офигенная книжка.
офигенная книжка.
Баг: растеризация линии. | 15 янв. 2007 | 17:57 | #3 |
---|
IROV..
я в тестовом проекте все ок? просто если много всего в общем проекте то небольшая скрытая ошибка может привести к странным ошибкам типа той что у тебя (разные DIP'ы баг, 1 DIP все ок).
а если через DrawPrimitiveUP ?
я в тестовом проекте все ок? просто если много всего в общем проекте то небольшая скрытая ошибка может привести к странным ошибкам типа той что у тебя (разные DIP'ы баг, 1 DIP все ок).
а если через DrawPrimitiveUP ?
Попадание куба во frustum - кто может помочь? | 12 янв. 2007 | 22:33 | #5 |
---|
NE_Mashinist
мало почему не знаю :(, в книжке Борескова написано про этот метод оптимизации.
мало почему не знаю :(, в книжке Борескова написано про этот метод оптимизации.
помогите .. привести char* к единому регистру (рус анг) на С++ | 12 янв. 2007 | 21:17 | #9 |
---|
Dan_Quimby
strlwr? strupr ?
strlwr? strupr ?
Попадание куба во frustum - кто может помочь? | 12 янв. 2007 | 21:15 | #2 |
---|
Хозяин
в идеальном случае достаточно двух т.е. минимально и максимально удаленной относительно каждой плоскости пирамиды видимости.
Roma75
http://www.pmg.org.ru/nehe/nehex2.htm
у меня работает и для OpenGL и для Direct3D. но код модифицирован с учетом оптимизации проверки.
в идеальном случае достаточно двух т.е. минимально и максимально удаленной относительно каждой плоскости пирамиды видимости.
Roma75
http://www.pmg.org.ru/nehe/nehex2.htm
у меня работает и для OpenGL и для Direct3D. но код модифицирован с учетом оптимизации проверки.
Компиляция HLSL шейдеров. Баги. | 12 янв. 2007 | 20:30 | #2 |
---|
функция normalize дотупна только в пиксельном шейдере версии начина я с 2.0 поэтому ты не сможешь получить
длину вектора даже вручную вызвав sqrt так как и эта функция доступна только в 2.0. так что твой шейдер не скомпилится с профилем ниже 2.0
На твоем месте я бы попробовал вручную приближенно вычислить корень, а потом наормализовать вектор.
Я смотрю ты видать бамп, делаешь наверное проблемы с вычислением или хранением Tangent и Binormal ? может лучше в формате вершин это предусмотреть?
длину вектора даже вручную вызвав sqrt так как и эта функция доступна только в 2.0. так что твой шейдер не скомпилится с профилем ниже 2.0
На твоем месте я бы попробовал вручную приближенно вычислить корень, а потом наормализовать вектор.
Я смотрю ты видать бамп, делаешь наверное проблемы с вычислением или хранением Tangent и Binormal ? может лучше в формате вершин это предусмотреть?
Компиляция HLSL шейдеров. Баги. | 12 янв. 2007 | 20:17 | #1 |
---|
mocia
ща прогнал на GPU Shader Analyser
все скомпилилось только вот объявить переменную текстурного семплера надо:
ща прогнал на 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 янв. 2007 | 20:00 | #9 |
---|
Nikifor
далее лишняя строчка strcpy добавит терминирующий ноль сама.
лучше укоротить
на
ну так вроде все нормально...
pMaterialBuffer вызываешь Release ? я так понимаю это ID3DXBuffer ?
далее лишняя строчка 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 ?
проблема с расширениями GL | 10 янв. 2007 | 19:20 | #4 |
---|
CG и VBO | 10 янв. 2007 | 19:12 | #1 |
---|
Crio
дак вроде в вершинный шейдер и поступает текущая вершина для обработки или я не так понял ? вот из этого нужно скакать.
дак вроде в вершинный шейдер и поступает текущая вершина для обработки или я не так понял ? вот из этого нужно скакать.
STL утечки памяти | 10 янв. 2007 | 19:10 | #6 |
---|
Nikifor
попробуй вот так:
вот так у меня все работает... раскоментируешь строчку _CrtSetBreakAlloc и найдешь место утечки.
попробуй вот так:
#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 |
STL утечки памяти | 10 янв. 2007 | 18:45 | #4 |
---|
Nikifor
так если я правильно понял то если это средство работает правильно то тебе нужно выставить адрес где утечка а потом через Call Stack в Debug найти место вызова.
где-то в подсказках это было.
так если я правильно понял то если это средство работает правильно то тебе нужно выставить адрес где утечка а потом через Call Stack в Debug найти место вызова.
где-то в подсказках это было.