Сообщения на форуме пользователя Andrey (135 стр.)
Не отображается тень на ландшафте, но отображается на плоскости. | 29 июня 2007 | 23:35 | #0 |
---|
Привет всем!
Успешно наконец перенес Shadow Map тени из Render Monkey в тестовый проект.
Все прекрасно работает. Если иcпользовать в качеcтве приемника теней плоскость (ID3DXMesh)
Если использовать ландшафт. То тень не отображается.
Вот скриншот результата тени c плоскостью:
Вот скриншот результат с ландшафтом(там сложно различить его очертания):
Шейдеры используются такие:
пиксельный и вершинный шейдер для текстуры глубины:
Шейдеры отбоса теней:
И накоенц пиксельный и вершинный шейдер приема теней:
Передаваемые параметры:
создание рендера в текстуру и прочий код работы с Direct3D и шейдерами приводить смысла нет.
В рендеринге ландшафте не никаких вызовов Direct3D кроме установки вершиннгого и индексного буфера + DIP
помогите получить тень на ландшафте.
Спасибо всем заранее. С Уважением Андрей.
Успешно наконец перенес Shadow Map тени из Render Monkey в тестовый проект.
Все прекрасно работает. Если иcпользовать в качеcтве приемника теней плоскость (ID3DXMesh)
Если использовать ландшафт. То тень не отображается.
Вот скриншот результата тени c плоскостью:
Вот скриншот результат с ландшафтом(там сложно различить его очертания):
Шейдеры используются такие:
пиксельный и вершинный шейдер для текстуры глубины:
uniform float4 lightPos: register(c0); uniform float distanceScale: register(c1); uniform float4x4 ProjMatrix: register(c2); struct VS_OUTPUT { float4 Pos: POSITION; float3 lightVec: TEXCOORD0; }; VS_OUTPUT VSmain(float4 Pos: POSITION){ VS_OUTPUT Out; float3 dirZ = -normalize(lightPos); float3 up = float3(0,0,1); float3 dirX = cross(up, dirZ); float3 dirY = cross(dirZ, dirX); float4 pos; Pos.xyz -= lightPos; pos.x = dot(dirX, Pos); pos.y = dot(dirY, Pos); pos.z = dot(dirZ, Pos); pos.w = 1; Out.Pos = mul(pos, ProjMatrix); Out.lightVec = distanceScale * Pos; Out.lightVec.x = length(Out.lightVec); Out.lightVec.y = 0.0f; return Out; } float4 PSmain(float2 lightVec: TEXCOORD0) : COLOR { return lightVec.x; }
uniform float4x4 WorldViewProjMatrix: register(c0); uniform float4 lightPos: register(c4); uniform float4 ViewPosition: register(c5); uniform float4x4 ProjMatrix: register(c6); uniform float distanceScale: register(c10); struct VS_OUTPUT { float4 Pos: POSITION; float4 shadowCrd: TEXCOORD0; float3 depthDiffuseSpecular: TEXCOORD1; }; VS_OUTPUT VSmain(float4 Pos: POSITION, float3 normal: NORMAL){ VS_OUTPUT Out; Out.Pos = mul(Pos, WorldViewProjMatrix); normal = normalize(normal); float3 lightVec = distanceScale * (lightPos - Pos.xyz); float3 viewVec = ViewPosition - Pos.xyz; float3 dirZ = -normalize(lightPos); float3 up = float3(0,0,1); float3 dirX = cross(up, dirZ); float3 dirY = cross(dirZ, dirX); float4 pos; Pos.xyz -= lightPos; pos.x = dot(dirX, Pos); pos.y = dot(dirY, Pos); pos.z = dot(dirZ, Pos); pos.w = 1; float4 sPos = mul(pos, ProjMatrix); sPos.z += 10; Out.shadowCrd.x = 0.5 * (sPos.z + sPos.x); Out.shadowCrd.y = 0.5 * (sPos.z - sPos.y); Out.shadowCrd.z = 0; Out.shadowCrd.w = sPos.z; Out.depthDiffuseSpecular.x = length(lightVec); lightVec /= Out.depthDiffuseSpecular.x; Out.depthDiffuseSpecular.y = saturate(dot(lightVec, normal)); Out.depthDiffuseSpecular.z = pow(saturate(dot(reflect(-normalize(viewVec), normal), lightVec)), 16); return Out; } uniform float shadowBias: register(c0); uniform float backProjectionCut: register(c1); uniform float Ka: register(c2); uniform float Kd: register(c3); uniform float Ks: register(c4); sampler ShadowMap: register(s1); float4 PSmain(float4 shadowCrd: TEXCOORD0, float3 depthDiffuseSpecular: TEXCOORD1) : COLOR { float depth = depthDiffuseSpecular.x; float diffuse = depthDiffuseSpecular.y; float specular = depthDiffuseSpecular.z; float shadowMap = tex2Dproj(ShadowMap, shadowCrd).r; float shadow = (depth < shadowMap + shadowBias); shadow *= (shadowCrd.w > backProjectionCut); float4 modelColor = float4(1.0f, 1.0f, 0.0f, 1.0f); return Ka * modelColor + (Kd * diffuse * modelColor + Ks * specular) * shadow; } |
uniform float4x4 WorldViewProjMatrix: register(c0); uniform float4 lightPos: register(c4); uniform float4 ViewPosition: register(c5); uniform float4x4 ProjMatrix: register(c6); uniform float distanceScale: register(c10); struct VS_OUTPUT { float4 Pos: POSITION; float2 tv: TEXCOORD0; float4 shadowCrd: TEXCOORD1; float3 depthDiffuseSpecular: TEXCOORD2; }; VS_OUTPUT VSmain(float4 Pos: POSITION, float3 normal: NORMAL, float2 tv: TEXCOORD0){ VS_OUTPUT Out; Out.tv = tv; Out.Pos = mul(Pos, WorldViewProjMatrix); float3 lightVec = distanceScale * (lightPos - Pos.xyz); float3 viewVec = ViewPosition - Pos.xyz; float3 dirZ = -normalize(lightPos); float3 up = float3(0,0,1); float3 dirX = cross(up, dirZ); float3 dirY = cross(dirZ, dirX); float4 pos; Pos.xyz -= lightPos; pos.x = dot(dirX, Pos); pos.y = dot(dirY, Pos); pos.z = dot(dirZ, Pos); pos.w = 1; float4 sPos = mul(ProjMatrix, pos); sPos.w = 1.0f; sPos.z += 10; Out.shadowCrd.x = 0.5 * (sPos.z + sPos.x); Out.shadowCrd.y = 0.5 * (sPos.z - sPos.y); Out.shadowCrd.z = 0; Out.shadowCrd.w = sPos.z; Out.depthDiffuseSpecular.x = length(lightVec); lightVec /= Out.depthDiffuseSpecular.x; Out.depthDiffuseSpecular.y = saturate(dot(lightVec, normal)); Out.depthDiffuseSpecular.z = pow(saturate(dot(reflect(-normalize(viewVec), normal), lightVec)), 16); return Out; } uniform float shadowBias: register(c0); uniform float backProjectionCut: register(c1); uniform float Ka: register(c2); uniform float Kd: register(c3); uniform float Ks: register(c4); uniform sampler objectTexture : register(s0); uniform sampler ShadowMap : register(s1); float4 PSmain(float2 tv: TEXCOORD0, float4 shadowCrd: TEXCOORD1, float3 depthDiffuseSpecular : TEXCOORD2) : COLOR { float depth = depthDiffuseSpecular.x; float diffuse = depthDiffuseSpecular.y; float specular = depthDiffuseSpecular.z; float shadowMap = tex2Dproj(ShadowMap, shadowCrd).r; float shadow = (depth < shadowMap + shadowBias); shadow *= (shadowCrd.w > backProjectionCut); float4 platformColor = 1.5 * tex2D(objectTexture, tv); return Ka * platformColor + (Kd * diffuse * platformColor + Ks * specular) * shadow; } |
const float backProjectionCut[4] = {78.0f, 0.0f,0.0f,0.0f}; const float shadowBias[4] = {0.01f, 0.0f, 0.0f, 0.0f}; const float distanceScale[4] = {0.001f, 0.0f, 0.0f, 0.0f}; const float Ks[4] = {0.62f, 0.0f, 0.0f, 0.0f}; const float Kd[4] = {1.0f, 0.0f, 0.0f, 0.0f}; const float Ka[4] = {0.1f, 0.0f, 0.0f, 0.0f}; const float ViewPosition[4] = {-139.0f, 69.0f, -125.74f, 1.0f}; const float lightPos[4] = {300.0f, 330.0f, 300.0f, 1.0f};
В рендеринге ландшафте не никаких вызовов Direct3D кроме установки вершиннгого и индексного буфера + DIP
помогите получить тень на ландшафте.
Спасибо всем заранее. С Уважением Андрей.
Некорректная отрисовка с помощью GL_ARB_vertex_buffer_object когда формат вершины содержит Tangent и Binormal | 29 июня 2007 | 23:29 | #0 |
---|
Привет всем!
отрисовка объектов идет через VBO.
Если ипользовать обычныфй формат вершин:
то все работает:
Вот пример:
как только добавляется Tangent и Binormal:
то объект рисуется покареженным:
Создание VBO стандартное.
Пробовал использовать так:
Пробовал другой вариант:
Результаты практическине отличаются.
Значение Stride[buffer->GetFormat()] == 56
Что я делаюне так?
Спасибо всем заранее.
С Уважением Андрей.
отрисовка объектов идет через VBO.
Если ипользовать обычныфй формат вершин:
// стандартная вершина struct Vertex { Math3D::Vector3D vert; Math3D::Vector3D normal; Math3D::Vector2D tvert; };
Вот пример:
как только добавляется Tangent и Binormal:
// описание вершины содержащей тангент и бинормаль struct TBNVertex { Math3D::Vector3D position; Math3D::Vector2D tvert; Math3D::Vector3D normal; Math3D::Vector3D tangent; Math3D::Vector3D binormal; };
Создание VBO стандартное.
Пробовал использовать так:
if (curVertexBuffer && Render::TEXCOORD2F_NORMAL3F_VERTEX3F_TANGENT_BINORMAL == curVertexBuffer->GetFormat()) { glDisableVertexAttribArrayARB(14); glDisableVertexAttribArrayARB(15); } curVertexBuffer = static_cast<const OpenGLVertexBuffer *>(buffer); // сохранить // выбрать буфер из памяти glBindBufferARB(GL_ARRAY_BUFFER_ARB, static_cast<const OpenGLVertexBuffer* >(buffer)->GetBufferId()); if (buffer->GetFormat() == Render::COLOR4_NORMAL3F_VERTEX3F) { glEnableClientState(GL_COLOR_ARRAY); } if (Render::TEXCOORD2F_VERTEX3F == buffer->GetFormat()) { // указатель на массив текстурных координат glTexCoordPointer(2, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + sizeof(Vector3D)); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } else if (buffer->GetFormat() != Render::VERTEX3F) { // указатель на массив нормалей glNormalPointer(GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + sizeof(Vector3D)); // указатель на массив текстурных координат glTexCoordPointer(2, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + sizeof(Vector3D) + sizeof(Vector3D)); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } if (Render::TEXCOORD2F_NORMAL3F_VERTEX3F_TANGENT_BINORMAL == buffer->GetFormat()) { glEnableVertexAttribArrayARB(14); glEnableVertexAttribArrayARB(15); glVertexAttribPointerARB(14, 3, GL_FLOAT, GL_FALSE, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + 2 * sizeof(Vector3D) + sizeof(Vector2D)); glVertexAttribPointerARB(15, 3, GL_FLOAT, GL_FALSE, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + 3 * sizeof(Vector3D) + sizeof(Vector2D)); } // указатель на массив вершин glVertexPointer(3, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL)); glEnableClientState(GL_VERTEX_ARRAY); |
curVertexBuffer = static_cast<const OpenGLVertexBuffer *>(buffer); // сохранить // выбрать буфер из памяти glBindBufferARB(GL_ARRAY_BUFFER_ARB, static_cast<const OpenGLVertexBuffer* >(buffer)->GetBufferId()); if (buffer->GetFormat() == Render::COLOR4_NORMAL3F_VERTEX3F) { glEnableClientState(GL_COLOR_ARRAY); } if (Render::TEXCOORD2F_VERTEX3F == buffer->GetFormat()) { // указатель на массив текстурных координат glTexCoordPointer(2, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + sizeof(Vector3D)); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } else if (buffer->GetFormat() != Render::VERTEX3F) { // указатель на массив нормалей glNormalPointer(GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + sizeof(Vector3D)); // указатель на массив текстурных координат glTexCoordPointer(2, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + sizeof(Vector3D) + sizeof(Vector3D)); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } if (Render::TEXCOORD2F_NORMAL3F_VERTEX3F_TANGENT_BINORMAL == buffer->GetFormat()) { glClientActiveTextureARB(GL_TEXTURE6_ARB); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(3, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + 2 * sizeof(Vector3D) + sizeof(Vector2D)); glClientActiveTextureARB(GL_TEXTURE7_ARB); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(3, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL) + 3 * sizeof(Vector3D) + sizeof(Vector2D)); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } // указатель на масси вершин glVertexPointer(3, GL_FLOAT, Stride[buffer->GetFormat()], static_cast<const char *>(NULL)); glEnableClientState(GL_VERTEX_ARRAY); |
Значение Stride[buffer->GetFormat()] == 56
Что я делаюне так?
Спасибо всем заранее.
С Уважением Андрей.
Черные oбъекты,если GL_ARB_vertex_program используется без GL_ARB_fragment_program. | 29 июня 2007 | 23:25 | #0 |
---|
Привет всем!
При отрисовке объектов где используется связка GL_ARB_fragment_program + GL_ARB_vertex_program
все работает нормально.
Как только отсуствует пикcельный шейдер объект выглядит черным. Но с вершинный шейдер работает правильно
(к примеру дерево качается)
Без шейдеров тоже все работает правильно. Отрисока дет через обычное использование VBO.
ARB шейдеры напрямую не использую, а получаю assembler'ый код из
Cg компилятора(версия 1.5.0019).
вот к примеру примитивный вершинный шейдер: Такой код выдает Cg компилятор:
переставил тег [соde], что бы не было горизонталього скроллинга. _Winnie.
!!ARBvp1.0
# cgc version 1.5.0019, build date Feb 22 2007 06:27:05
# command line args: -q -profile arbvp1 -entry vsMain -DWorldViewProj=state.matrix.mvp.transpose -DWORLDVIEWPROJ=state.matrix.mvp.transpose -Dworldviewproj=state.matrix.mvp.transpose -DProjection=state.matrix.projection -DPROJECTION=state.matrix.projection -Dprojection=state.matrix.projection -DView=state.matrix.modelview.transpose -DVIEW=state.matrix.modelview.transpose -Dview=state.matrix.modelview.transpose -DWorld=state.matrix.modelview.transpose -DWORLD=state.matrix.modelview.transpose -Dworld=state.matrix.modelview.transpose NumTemps=65535 MaxInstructions=256 MaxAddressRegs=1 MaxLocalParams=256
И вот простейший пиксельный шейдер, с которым к примеру все работает.
Вот такой код выдает Cg компилятор:
Приводить код создания и использования Вершинного и пиксельного шейдера смысла нету, т.к. так все работает когда
они используются вместе.
Сразу приведу код коогда пиксельный шейдер отсутствует:
везде при работе GL_NO_ERROR == glGetError();
Знаю что по стандарту вершинный шейдер может работать без пиксельного.
Данная ошибка замечена на GeForce 6600, GeForce2, Radeon 9200 SE(а там вообще нет поддержки GL_ARB_fragment_program) и
Radeon X1300.
Что я делаю нет так?
Спасибо всем заранее с уважением Андрей.
При отрисовке объектов где используется связка GL_ARB_fragment_program + GL_ARB_vertex_program
все работает нормально.
Как только отсуствует пикcельный шейдер объект выглядит черным. Но с вершинный шейдер работает правильно
(к примеру дерево качается)
Без шейдеров тоже все работает правильно. Отрисока дет через обычное использование VBO.
ARB шейдеры напрямую не использую, а получаю assembler'ый код из
Cg компилятора(версия 1.5.0019).
вот к примеру примитивный вершинный шейдер: Такой код выдает Cg компилятор:
переставил тег [соde], что бы не было горизонталього скроллинга. _Winnie.
!!ARBvp1.0
# cgc version 1.5.0019, build date Feb 22 2007 06:27:05
# command line args: -q -profile arbvp1 -entry vsMain -DWorldViewProj=state.matrix.mvp.transpose -DWORLDVIEWPROJ=state.matrix.mvp.transpose -Dworldviewproj=state.matrix.mvp.transpose -DProjection=state.matrix.projection -DPROJECTION=state.matrix.projection -Dprojection=state.matrix.projection -DView=state.matrix.modelview.transpose -DVIEW=state.matrix.modelview.transpose -Dview=state.matrix.modelview.transpose -DWorld=state.matrix.modelview.transpose -DWORLD=state.matrix.modelview.transpose -Dworld=state.matrix.modelview.transpose NumTemps=65535 MaxInstructions=256 MaxAddressRegs=1 MaxLocalParams=256
#vendor NVIDIA Corporation #version 1.5.0.19 #profile arbvp1 #program vsMain #semantic DiffSampler #semantic ModelViewProjection : STATE.MATRIX.MVP.TRANSPOSE #var float4 position : $vin.POSITION : POSITION : 0 : 1 #var float2 uv0 : $vin.TEXCOORD0 : TEXCOORD0 : 1 : 1 #var sampler DiffSampler : : : -1 : 0 #var float4x4 ModelViewProjection : STATE.MATRIX.MVP.TRANSPOSE : c[1], 4 : -1 : 1 #var float4 vsMain.position : $vout.POSITION : HPOS : -1 : 1 #var float2 vsMain.uv0 : $vout.TEXCOORD0 : TEX0 : -1 : 1 PARAM c[5] = { program.local[0], state.matrix.mvp.transpose }; TEMP R0; MUL R0, vertex.position.y, c[2]; MAD R0, vertex.position.x, c[1], R0; MAD R0, vertex.position.z, c[3], R0; MAD result.position, vertex.position.w, c[4], R0; MOV result.texcoord[0].xy, vertex.texcoord[0]; END # 5 instructions, 1 R-regs |
float4 psMain(in PS IN) : COLOR { float4 diffColor = tex2D(DiffSampler, IN.uv0); return diffColor; }
они используются вместе.
Сразу приведу код коогда пиксельный шейдер отсутствует:
if (GLEW_ARB_fragment_program) { // выбрать пустую glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0); #ifdef _DEBUG CheckOpenGLError(); #endif glDisable(GL_FRAGMENT_PROGRAM_ARB); #ifdef _DEBUG CheckOpenGLError(); #endif } if (glUseProgramObjectARB) { // выбрать пустую glUseProgramObjectARB(0); } #ifdef _DEBUG CheckOpenGLError(); #endif
Знаю что по стандарту вершинный шейдер может работать без пиксельного.
Данная ошибка замечена на GeForce 6600, GeForce2, Radeon 9200 SE(а там вообще нет поддержки GL_ARB_fragment_program) и
Radeon X1300.
Что я делаю нет так?
Спасибо всем заранее с уважением Андрей.
Правка: 30 июня 2007 0:18
OGRE и C++ Builder | 20 июня 2007 | 13:09 | #1 |
---|
Sniper
очень будет сложно, убогий компилятор дебилдера не держит стандарт C++ даже новый дебилдер от BDS 2006
не может включать заголовки по новому стандарту к примеру #include <cstdio> хотя в папке есть. и т.д.
почему-то к примеру OopenSource бибилиотеки собираются отлично на gcc и MSVC, а вот это убожество какое-то особенное
почему-то нужно к примеру пришлось писать std::memset вместо просто memset... что там настараивать нужно не пойму.
изрядно нужно переписать код и собрать весь Ogre под дебилдером. Еще и переконвертить все сторониие *.lib(у которых нет исходников) в формат дебилдера com2off.exe(вроде так называется) в папке bin валяется. . Или загружать функции из dll библиотек через GetProccAdress.
В общем выкинь в топку это гавно.
очень будет сложно, убогий компилятор дебилдера не держит стандарт C++ даже новый дебилдер от BDS 2006
не может включать заголовки по новому стандарту к примеру #include <cstdio> хотя в папке есть. и т.д.
почему-то к примеру OopenSource бибилиотеки собираются отлично на gcc и MSVC, а вот это убожество какое-то особенное
почему-то нужно к примеру пришлось писать std::memset вместо просто memset... что там настараивать нужно не пойму.
изрядно нужно переписать код и собрать весь Ogre под дебилдером. Еще и переконвертить все сторониие *.lib(у которых нет исходников) в формат дебилдера com2off.exe(вроде так называется) в папке bin валяется. . Или загружать функции из dll библиотек через GetProccAdress.
В общем выкинь в топку это гавно.
sin/cos table - ностальгия? | 20 июня 2007 | 11:14 | #43 |
---|
Suslik
Ну у меня тоже времени нет :)
Ну у меня тоже времени нет :)
sin/cos table - ностальгия? | 20 июня 2007 | 10:51 | #39 |
---|
Xepypr
далее надо поставить опции компилятора по оптимизации.
к примеру
Buffer Security Check - No
Global Optimizations - Yes
Inline Function Expansion - /Ob1
Enable Intristic Functions - /Oi
Favor Size of Speed /Ot
Debug Information Format - Disabled
далее надо поставить опции компилятора по оптимизации.
к примеру
Buffer Security Check - No
Global Optimizations - Yes
Inline Function Expansion - /Ob1
Enable Intristic Functions - /Oi
Favor Size of Speed /Ot
Debug Information Format - Disabled
sin/cos table - ностальгия? | 20 июня 2007 | 10:46 | #38 |
---|
Xepypr
может лучше отдельно скомпилить программу с каждым тестом и запустить?
Нафиг этот timeGetTime ? вызов этой функции медленей чем к примеру clock()
вот так может более правильно, последовательно по одному макросу раскоментировать и проверять:
может лучше отдельно скомпилить программу с каждым тестом и запустить?
Нафиг этот timeGetTime ? вызов этой функции медленей чем к примеру clock()
вот так может более правильно, последовательно по одному макросу раскоментировать и проверять:
#include <stdio.h> #include <conio.h> #include <math.h> #include <ctime> const float PI = 3.1415926535897932384626433832795f; const int TableQ = 1024*8; const int TableSize = 360*TableQ; const float D2R = PI/180.0f; const float R2D = 180.0f/PI; const float Step = PI/4564561.0f; float SinTable[TableSize]; float CosTable[TableSize]; void SolveSinTable() { for(int i=0;i<TableSize;i++) SinTable[i] = sin(float(i)/TableQ*D2R); } void SolveCosTable() { for(int i=0;i<TableSize;i++) CosTable[i] = cos(float(i)/TableQ*R2D); } void SinCosSTD(float angle, float& xsin, float& xcos) { xsin = SinTable[int(angle*TableQ*R2D)]; xcos = CosTable[int(angle*TableQ*R2D)]; } void SinCos(float angle, float& xsin, float& xcos) { xsin = sin(angle); xcos = cos(angle); } void SinCosFPU(float angle, float& xsin, float& xcos) { __asm { fld angle fsincos mov eax, xcos fstp dword ptr [eax] mov eax, xsin fstp dword ptr [eax] } } //#define FPU //#define STD #define SINCOS int main(void) { SolveSinTable(); SolveCosTable(); float sin = 0.0f; float cos = 0.0f; float angle = 0.0f; unsigned long time = 0; unsigned long end = 0; #ifdef FPU /*****************************************/ puts("Run SinCosFPU test!"); time = clock(); for(angle=0.0f;angle<2*PI;angle+=Step) SinCosFPU(angle, sin, cos); end = clock()-time; printf("Test time: %li\n\n", end); #endif #ifdef STD /*****************************************/ puts("Run SinCosSTD test!"); time = clock(); for(angle=0.0f;angle<2*PI;angle+=Step) SinCosSTD(angle, sin, cos); end = clock()-time; printf("Test time: %li\n\n", end); #endif #ifdef SINCOS /*****************************************/ puts("Run SinCos test!"); time = clock(); for(angle=0.0f;angle<2*PI;angle+=Step) SinCos(angle, sin, cos); end = clock()-time; printf("Test time: %li\n\n", end); /*****************************************/ #endif puts("All tests complite!"); getchar(); return 0; }
D3DXCreateCylinder и непонятки с ID3DXMesh | 18 июня 2007 | 15:25 | #1 |
---|
kuzya_vl
ты читал Help ?
Remarks
The created cylinder is centered at the origin, and its axis is aligned with the z-axis.
// а вот тут ты пишешь прямо в нормаль ;) и получается фигня. pVertices[i].color = D3DCOLOR_COLORVALUE( 1.0, 1.0, 0.0, 1.0 );
Remarks
The created cylinder is centered at the origin, and its axis is aligned with the z-axis.
This function creates a mesh with the D3DXMESH_MANAGED creation option and D3DFVF_XYZ | D3DFVF_NORMAL flexible vertex format (FVF).
эта функция создает цилиндр с форматом вершин в котором нет цвета вершины :)
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер | 15 июня 2007 | 20:37 | #13 |
---|
innuendo
потому что первый я уже пробовал.
а вот второй нет.
потому что первый я уже пробовал.
а вот второй нет.
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер | 15 июня 2007 | 20:06 | #11 |
---|
innuendo
лучше второй вариант...
лучше второй вариант...
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер | 15 июня 2007 | 19:44 | #9 |
---|
innuendo
>Выпадаю в осадок.
>Используешь glBindProgram(), glProgramLocalParameter4fvARB(), glEnable(GL_VERTEX_PROGRAM_ARB)
>а загрузить vertex program НЕ МОЖЕШЬ ?
ну надо делать тестовый пример, в общем конечно надо попробовать.
>Выпадаю в осадок.
>Используешь glBindProgram(), glProgramLocalParameter4fvARB(), glEnable(GL_VERTEX_PROGRAM_ARB)
>а загрузить vertex program НЕ МОЖЕШЬ ?
ну надо делать тестовый пример, в общем конечно надо попробовать.
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер | 15 июня 2007 | 19:23 | #7 |
---|
innuendo
>Ты мой пример попробывал? Я ж не вижу весь код, я что телепат?
Я не могу подсунуть ARB шейдер движку напрямую.
Я просто отказался от поддержки asm в чистом виде, это возможно уже не актуально.
Я просто попробовал переписать Cg шейдер вот так:
в результате получился вот такой код:
который наконец заработал :)
Но проблема ручной передачи параметров осталась.
>Ты мой пример попробывал? Я ж не вижу весь код, я что телепат?
Я не могу подсунуть ARB шейдер движку напрямую.
Я просто отказался от поддержки asm в чистом виде, это возможно уже не актуально.
Я просто попробовал переписать Cg шейдер вот так:
uniform float4x4 ModelViewProjection : state.matrix.mvp; // the model*view*projection matrix |
shaders/sosnaOpenGL.cg: !!ARBvp1.0 # cgc version 1.5.0019, build date Feb 22 2007 06:27:05 # command line args: -q -profile arbvp1 -entry vsMain NumTemps=48 MaxInstructions=512 MaxAddressRegs=2 MaxLocalParams=256 #vendor NVIDIA Corporation #version 1.5.0.19 #profile arbvp1 #program vsMain #semantic DiffSampler #semantic ModelViewProjection : STATE.MATRIX.MVP #var float4 position : $vin.POSITION : POSITION : 0 : 1 #var float2 uv0 : $vin.TEXCOORD0 : TEXCOORD0 : 1 : 1 #var sampler DiffSampler : : : -1 : 0 #var float4x4 ModelViewProjection : STATE.MATRIX.MVP : c[1], 4 : -1 : 1 #var float4 vsMain.position : $vout.POSITION : HPOS : -1 : 1 #var float2 vsMain.uv0 : $vout.TEXCOORD0 : TEX0 : -1 : 1 PARAM c[5] = { program.local[0], state.matrix.mvp }; MOV result.texcoord[0].xy, vertex.texcoord[0]; DP4 result.position.w, vertex.position, c[4]; DP4 result.position.z, vertex.position, c[3]; DP4 result.position.y, vertex.position, c[2]; DP4 result.position.x, vertex.position, c[1]; END # 5 instructions, 0 R-regs |
Но проблема ручной передачи параметров осталась.
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер | 15 июня 2007 | 12:12 | #5 |
---|
innuendo
Ты видать не понял :) я не могу править на ходу asm код выданный Cg компилятором :)
я пишу движок с мультирендером. что-бы не писать разные шейдеры под разные API использую Cg компилятор.
С Direct3D я Cg скрестил + передача параметров т.д. и Сделал это без использования Cg Direct3D9 Run Time.
т.е. прямая передача параметров через IDirect3D9::SetVertexShaderConstantf/SetPixelShaderConstant
Вот тепрь делаю тоже самое с OpenGL.
сначала попробую GL_ARB_vertex_program/GL_ARB_fragment_program + NV_extensions потом буду Cg в GLSL пробовать.
>а зачем ты для такой простой program Cg юзал?
Я его юзать буду для всех программ.
Ты видать не понял :) я не могу править на ходу asm код выданный Cg компилятором :)
я пишу движок с мультирендером. что-бы не писать разные шейдеры под разные API использую Cg компилятор.
С Direct3D я Cg скрестил + передача параметров т.д. и Сделал это без использования Cg Direct3D9 Run Time.
т.е. прямая передача параметров через IDirect3D9::SetVertexShaderConstantf/SetPixelShaderConstant
Вот тепрь делаю тоже самое с OpenGL.
сначала попробую GL_ARB_vertex_program/GL_ARB_fragment_program + NV_extensions потом буду Cg в GLSL пробовать.
>а зачем ты для такой простой program Cg юзал?
Я его юзать буду для всех программ.
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер | 14 июня 2007 | 19:24 | #3 |
---|
innuendo
Ща попробовал траспонировать матрицу результат такой-же на экране все пусто.
All
Есть еще варианты?
Ща попробовал траспонировать матрицу результат такой-же на экране все пусто.
All
Есть еще варианты?