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

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

Не отображается тень на ландшафте, но отображается на плоскости.29 июня 200723:35#0
Привет всем!
Успешно наконец перенес 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  и шейдерами приводить смысла нет.
В рендеринге ландшафте не никаких вызовов Direct3D кроме установки вершиннгого и индексного буфера + DIP
помогите получить тень на ландшафте.
Спасибо всем заранее. С Уважением Андрей.
Некорректная отрисовка с помощью GL_ARB_vertex_buffer_object когда формат вершины содержит Tangent и Binormal29 июня 200723:29#0
Привет всем!
отрисовка объектов идет через 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 июня 200723:25#0
Привет всем!
При отрисовке объектов где используется связка GL_ARB_fragment_program + GL_ARB_vertex_program
все работает нормально.
Как только отсуствует пикcельный шейдер объект выглядит черным. Но с вершинный шейдер работает правильно
(к примеру дерево качается)
Без шейдеров тоже все работает правильно. Отрисока дет через обычное использование VBO.
ARB шейдеры напрямую не использую, а получаю assembler'ый код из
Cg компилятора(версия 1.5.0019).
вот к примеру примитивный вершинный шейдер:
struct PS {
    float4 position     : POSITION;         // position in projection space
    float2 uv0          : TEXCOORD0;        // texture coordinate
};
uniform float4x4 ModelViewProjection : WorldViewProj; //register(c0); // the model*view*projection matrix

PS vsMain(float4 position : POSITION, float2 uv0 : TEXCOORD0)
{
  vsOut.position = mul(position, ModelViewProjection);
  vsOut.uv0 = uv0;
  return vsOut;
}

Такой код выдает 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;

}
Вот такой код выдает Cg компилятор:
!!ARBfp1.0
# cgc version 1.5.0019, build date Feb 22 2007 06:27:05
# command line args: -q -profile arbfp1 -entry psMain NumTemps=64 NumInstructionSlots=1024 MaxLocalParams=64 NumTexInstructionSlots=512 NumMathInstructionSlots=512 MaxTexIndirections=512 MaxDrawBuffers=4
#vendor NVIDIA Corporation
#version 1.5.0.19
#profile arbfp1
#program psMain
#semantic DiffSampler
#semantic ModelViewProjection : WORLDVIEWPROJ
#var float2 IN.uv0 : $vin.TEXCOORD0 : TEX0 : 0 : 1
#var sampler2D DiffSampler :  : texunit 0 : -1 : 1
#var float4x4 ModelViewProjection : WORLDVIEWPROJ : , 4 : -1 : 0
#var float4 psMain : $vout.COLOR : COL : -1 : 1
TEX result.color, fragment.texcoord[0], texture[0], 2D;
END
# 1 instructions, 0 R-regs

Приводить код создания и использования Вершинного и пиксельного шейдера смысла нету, т.к. так все работает когда
они используются вместе.
Сразу приведу код коогда пиксельный шейдер отсутствует:
    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  
везде при работе GL_NO_ERROR == glGetError();
Знаю что по стандарту вершинный шейдер может работать без пиксельного.
Данная ошибка замечена на GeForce 6600, GeForce2, Radeon 9200 SE(а там вообще нет поддержки GL_ARB_fragment_program) и
Radeon X1300.
Что я делаю нет так?
Спасибо всем заранее с уважением Андрей.

Правка: 30 июня 2007 0:18

OGRE и C++ Builder20 июня 200713:09#1
Sniper
очень будет сложно, убогий компилятор дебилдера не держит стандарт C++ даже новый дебилдер от BDS 2006
не может включать заголовки по новому стандарту к примеру #include <cstdio> хотя в папке есть. и т.д.
почему-то к примеру OopenSource бибилиотеки собираются отлично на gcc и MSVC, а вот это убожество какое-то особенное
почему-то нужно к примеру пришлось писать std::memset вместо просто memset... что там настараивать нужно не пойму.
изрядно нужно переписать код и собрать весь Ogre под дебилдером. Еще и переконвертить все сторониие *.lib(у которых нет исходников) в формат дебилдера com2off.exe(вроде так называется) в папке bin валяется. . Или загружать функции из dll библиотек через GetProccAdress.
В общем выкинь в топку это гавно.

sin/cos table - ностальгия?20 июня 200711:14#43
Suslik
Ну у меня тоже времени нет :)
sin/cos table - ностальгия?20 июня 200710: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
sin/cos table - ностальгия?20 июня 200710:46#38
Xepypr
может лучше отдельно скомпилить программу с  каждым тестом и запустить?
Нафиг этот 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;
}
wcout19 июня 200719:47#2
dub
попробуй setlocale вызвать что передавать не помню..

D3DXCreateCylinder и непонятки с ID3DXMesh18 июня 200715:25#1
kuzya_vl
// а вот тут ты пишешь прямо в нормаль ;) и получается фигня.
pVertices[i].color = D3DCOLOR_COLORVALUE( 1.0, 1.0, 0.0, 1.0 ); 
ты читал Help ?
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 июня 200720:37#13
innuendo
потому что первый я уже пробовал.
а вот второй нет.
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер15 июня 200720:06#11
innuendo
лучше второй вариант...
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер15 июня 200719:44#9
innuendo
>Выпадаю в осадок.
>Используешь glBindProgram(), glProgramLocalParameter4fvARB(), glEnable(GL_VERTEX_PROGRAM_ARB)
>а загрузить vertex program НЕ МОЖЕШЬ ?
ну надо делать тестовый пример, в общем конечно надо попробовать.
Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер15 июня 200719:23#7
innuendo
>Ты мой пример попробывал? Я ж не вижу весь код, я что телепат?
Я не могу подсунуть 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 июня 200712: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 юзал?
Я его юзать буду для всех программ.

Cg->GL_ARB_vertex_program, не работает простейший вершинный шейдер14 июня 200719:24#3
innuendo
Ща попробовал траспонировать матрицу результат такой-же на экране все пусто.
All
Есть еще варианты?

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

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