Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Sauron

Strony: [1] 2 3 ... 14
1
Programowanie / D3DX11 i Visual Studio 2015
« dnia: 2016-01-08, 20:05 »
Rzeczywiście nie sprawdzałem jej zawartości, myślałem że mówisz o sprawdzeniu wyniku D3DX11CompileFromFile, a przypisanie uznałem za podanie wskaźnika do fx odpowiedniej metodzie (skrót myślowy, czy jakkolwiek to nazwać).

HRESULT po wywołaniu D3DX11CreateEffectFromMemory to E_NOINTERFACE. Z http://stackoverflow.com/questions/12549472/using-directx-effect11-with-visual-studio-2012 wynika, że błąd jest spowodowany wersją DX11, a dokładniej tym, że D3DX jest "deprecated". Najwidoczniej będę musiał użyć czegoś innego.

Nie wiem dlaczego sam nie wpadłem na to, żeby sprawdzić co zwraca to funkcja  :wstyd: . W każdym razie: dziękuję za pomoc!

2
Programowanie / D3DX11 i Visual Studio 2015
« dnia: 2016-01-08, 17:55 »
Widać obie rzeczy :P

#include <Windows.h>
#include <d3d11.h>
#include <D3DX11.h>
#include <d3dx11effect.h>
#include <sstream>
#include "GameTimer.h"
#include "MathHelper.h"
#include <d3dcompiler.h>

struct Vertex
{
XMFLOAT3 Position;
XMFLOAT3 Color;
};


namespace Colors
{
XMGLOBALCONST XMVECTORF32 White = { 1.0f, 1.0f, 1.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Black = { 0.0f, 0.0f, 0.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Red = { 1.0f, 0.0f, 0.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Green = { 0.0f, 1.0f, 0.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Blue = { 0.0f, 0.0f, 1.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Yellow = { 1.0f, 1.0f, 0.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Cyan = { 0.0f, 1.0f, 1.0f, 1.0f };
XMGLOBALCONST XMVECTORF32 Magenta = { 1.0f, 0.0f, 1.0f, 1.0f };

XMGLOBALCONST XMVECTORF32 Silver = { 0.75f, 0.75f, 0.75f, 1.0f };
XMGLOBALCONST XMVECTORF32 LightSteelBlue = { 0.69f, 0.77f, 0.87f, 1.0f };
}

HWND windowHandler;
const int width = 900;
const int height = 680;
const LPTSTR wndCaption = L"DirectX";

ID3D11Device* d3dDevice;
ID3D11DeviceContext* d3dContext;
IDXGISwapChain* swapChain;
ID3D11RenderTargetView* renderTargetView;
ID3D11Texture2D* depthStencilBuffer;
ID3D11DepthStencilView* depthStencilView;
D3D11_VIEWPORT d3dViewport;

ID3D11Buffer* vertexBuffer;
ID3D11Buffer* indicesBuffer;
ID3D11RasterizerState* rasterState;
ID3DX11Effect* fx;
ID3DX11EffectTechnique* technique;
ID3DX11EffectMatrixVariable* fxMVPMatrix;
ID3D11InputLayout* inputLayout;

XMFLOAT4X4 mWorld;
XMFLOAT4X4 mView;
XMFLOAT4X4 mProj;

float mTheta;
float mPhi;
float mRadius;

GameTimer gameTimer;

void CalculateFrameStats();
void UpdateScene(float dt);
void Render();

void SetMatrices()
{
XMStoreFloat4x4(&mView, XMMatrixIdentity());

XMVECTOR pos = XMVectorSet(0.0f, 0.0f, -1.0f, 1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMMATRIX V = XMMatrixLookAtLH(pos, target, up);
XMStoreFloat4x4(&mView, V);

XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f * MathHelper::Pi, (float)width / height, 1.0f, 1000.f);
XMStoreFloat4x4(&mProj, P);
}
void BuildGeometryBuffers()
{
Vertex vertices[] =
{
{ XMFLOAT3(-1.0f, -1.0f, -1.0f), (const float*)&Colors::White },
{ XMFLOAT3(-1.0f, 1.0f, -1.0f), (const float*)&Colors::Black },
{ XMFLOAT3(1.0f, 1.0f, -1.0f), (const float*)&Colors::Red },
{ XMFLOAT3(1.0f, -1.0f, -1.0f), (const float*)&Colors::Green },
{ XMFLOAT3(-1.0f, -1.0f, 1.0f), (const float*)&Colors::Blue },
{ XMFLOAT3(-1.0f, 1.0f, 1.0f), (const float*)&Colors::Yellow },
{ XMFLOAT3(1.0f, 1.0f, 1.0f), (const float*)&Colors::Cyan },
{ XMFLOAT3(1.0f, -1.0f, 1.0f), (const float*)&Colors::Magenta },
};

D3D11_BUFFER_DESC vbd;
vbd.Usage = D3D11_USAGE_IMMUTABLE;
vbd.ByteWidth = sizeof(Vertex) * 8;
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;

D3D11_SUBRESOURCE_DATA vertexInitData;
vertexInitData.pSysMem = vertices;

HRESULT hr = d3dDevice->CreateBuffer(&vbd, &vertexInitData, &vertexBuffer);

if (FAILED(hr))
{
MessageBox(NULL, L"Failed to create vertex buffer!", L"Error!", MB_OK | MB_ICONERROR);
}

UINT indices[24] =
{
0, 1, 2,
0, 2, 3,
0, 3, 4,
0, 4, 5,
0, 5, 6,
0, 6, 7,
0, 7, 8,
0, 8, 1
};

D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT) * 24;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0;

D3D11_SUBRESOURCE_DATA indicesInitData;
indicesInitData.pSysMem = indices;

hr = d3dDevice->CreateBuffer(&ibd, &indicesInitData, &indicesBuffer);

if (FAILED(hr))
{
MessageBox(NULL, L"Failed to create index buffer!", L"Error!", MB_OK | MB_ICONERROR);
}
}
void BuildFX()
{
DWORD shaderFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
shaderFlags |= D3D10_SHADER_DEBUG;
shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;
#endif

ID3D10Blob* compiledShader = 0;
ID3D10Blob* compilationMsgs = 0;

HRESULT hr = D3DX11CompileFromFile(L"FX/color.fx", 0, 0, 0, "fx_5_0", shaderFlags, 0, 0, &compiledShader, &compilationMsgs, 0);

if (compilationMsgs != 0)
{
MessageBoxA(0, (char*)compilationMsgs->GetBufferPointer(), 0, 0);
compilationMsgs->Release();
}
if (FAILED(hr))
{
MessageBox(0, L"Some error while compiling fx file!", L"Error", MB_OK | MB_ICONERROR);
}

D3DX11CreateEffectFromMemory(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), 0, d3dDevice, &fx);
compiledShader->Release();

technique = fx->GetTechniqueByName("ColorTech");
fxMVPMatrix = fx->GetVariableByName("gWorldViewProj")->AsMatrix();
}
void BuildVertexLayout()
{
D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};

D3DX11_PASS_DESC passDesc;
technique->GetPassByIndex(0)->GetDesc(&passDesc);
d3dDevice->CreateInputLayout(vertexDesc, 2, passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &inputLayout);
}

void Dispose()
{
vertexBuffer->Release();
indicesBuffer->Release();
fx->Release();
inputLayout->Release();
renderTargetView->Release();
depthStencilView->Release();
swapChain->Release();
depthStencilBuffer->Release();

if (d3dContext)
d3dContext->ClearState();

d3dContext->Release();
d3dDevice->Release();
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_MENUCHAR:
return MAKELRESULT(0, MNC_CLOSE);
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}

void CalculateFrameStats()
{
static int frameCnt = 0;
static float timeElapsed = 0.0f;

frameCnt++;

if ((gameTimer.TotalTime() - timeElapsed) >= 1.0f)
{
float fps = (float)frameCnt;
float mspf = 1000.0f / fps;

std::wostringstream outs;
outs.precision(6);
outs << wndCaption << L"    "
<< L"FPS: " << fps << L"    "
<< L"Frame Time: " << mspf << L" (ms)";
SetWindowText(windowHandler, outs.str().c_str());

frameCnt = 0;
timeElapsed += 1.0f;
}
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
gameTimer = GameTimer();

WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = L"MainWindow";
wc.style = CS_HREDRAW | CS_VREDRAW;

if (!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Could not register window class!", L"Error", MB_OK | MB_ICONERROR);
return 1;
}
RECT rect = { 0, 0, width, height };
AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, FALSE, NULL);
windowHandler = CreateWindowEx(NULL, L"MainWindow", wndCaption, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, hInstance, NULL);

if (!windowHandler)
{
MessageBox(NULL, L"Could not create window!", L"Error", MB_OK | MB_ICONERROR);
return 1;
}

ShowWindow(windowHandler, SW_SHOW);
UpdateWindow(windowHandler);

UINT createDeviceFlag = 0;
#if defined(DEBUG) || defined(_DEBUG)
createDeviceFlag |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_FEATURE_LEVEL d3dFeatureLevel;
HRESULT hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlag, 0, 0, D3D11_SDK_VERSION, &d3dDevice, &d3dFeatureLevel, &d3dContext);
if (FAILED(hr))
{
MessageBox(NULL, L"Failed to create device!", L"Error!", MB_OK | MB_ICONERROR);
return 1;
}

UINT msaa4xQualityLevel;
d3dDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, 4, &msaa4xQualityLevel);

DXGI_SWAP_CHAIN_DESC scd;
scd.BufferDesc.Width = width;
scd.BufferDesc.Height = height;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.RefreshRate.Numerator = 60;
scd.BufferDesc.RefreshRate.Denominator = 1;
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
scd.SampleDesc.Count = 4;
scd.SampleDesc.Quality = msaa4xQualityLevel - 1;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.Flags = 0;
scd.Windowed = true;
scd.OutputWindow = windowHandler;
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
scd.BufferCount = 1;

IDXGIDevice* dxgiDevice = 0;
d3dDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice));

IDXGIAdapter* dxgiAdapter = 0;
dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&dxgiAdapter));

IDXGIFactory* dxgiFactory = 0;
dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&dxgiFactory));

dxgiFactory->CreateSwapChain(d3dDevice, &scd, &swapChain);

dxgiDevice->Release();
dxgiAdapter->Release();
dxgiFactory->Release();

ID3D11Texture2D* backBuffer;
swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer));
d3dDevice->CreateRenderTargetView(backBuffer, 0, &renderTargetView);
backBuffer->Release();

D3D11_TEXTURE2D_DESC depthStencilDesc;
depthStencilDesc.ArraySize = 1;
depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthStencilDesc.CPUAccessFlags = 0;
depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilDesc.Width = width;
depthStencilDesc.Height = height;
depthStencilDesc.MipLevels = 1;
depthStencilDesc.MiscFlags = 0;
depthStencilDesc.SampleDesc.Count = 4;
depthStencilDesc.SampleDesc.Quality = msaa4xQualityLevel - 1;
depthStencilDesc.Usage = D3D11_USAGE_DEFAULT;

d3dDevice->CreateTexture2D(&depthStencilDesc, 0, &depthStencilBuffer);
d3dDevice->CreateDepthStencilView(depthStencilBuffer, 0, &depthStencilView);

d3dContext->OMSetRenderTargets(1, &renderTargetView, depthStencilView);

d3dViewport.TopLeftX = 100;
d3dViewport.TopLeftY = 100;
d3dViewport.Width = 500;
d3dViewport.Height = 500;
d3dViewport.MinDepth = 0.0;
d3dViewport.MaxDepth = 1.0;

d3dContext->RSSetViewports(1, &d3dViewport);

SetMatrices();

BuildGeometryBuffers();
BuildFX();
BuildVertexLayout();

gameTimer.Reset();

MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
gameTimer.Tick();
CalculateFrameStats();
UpdateScene(gameTimer.DeltaTime());
Render();
}
}

Dispose();

return msg.wParam;
}

void UpdateScene(float dt)
{

}

void Render()
{
d3dContext->ClearRenderTargetView(renderTargetView, reinterpret_cast<const float*>(&Colors::Black));
d3dContext->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0, 0);

d3dContext->IASetInputLayout(inputLayout);
d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
UINT stride = sizeof(Vertex);
UINT offset = 0;
d3dContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
d3dContext->IASetIndexBuffer(indicesBuffer, DXGI_FORMAT_R32_UINT, 0);

XMMATRIX world = XMLoadFloat4x4(&mWorld);
XMMATRIX view = XMLoadFloat4x4(&mView);
XMMATRIX proj = XMLoadFloat4x4(&mProj);
XMMATRIX mvp = world*view*proj;
fxMVPMatrix->SetMatrix(reinterpret_cast<float*>(&mvp));

D3DX11_TECHNIQUE_DESC techDesc;
technique->GetDesc(&techDesc);
for (UINT p = 0; p < techDesc.Passes; ++p)
{
technique->GetPassByIndex(p)->Apply(0, d3dContext);
d3dContext->DrawIndexed(36, 0, 0);
}

swapChain->Present(0, 0);
}

Ze względu na to, że kodu jest w miarę dużo i nie jest zbyt ładny, zalecam początkowo obadać metodę BuildFX.

3
Programowanie / D3DX11 i Visual Studio 2015
« dnia: 2016-01-08, 16:50 »
Szczerze powiedziawszy domyśliłem się :P Pytanie: dlaczego? Powyżej odwołania do fx są dwa warunki sprawdzające czy nie wystąpił żaden błąd kompilacji efektu. Oba nie pokazują nic złego, więc coś w tej zmiennej powinno być.

4
Programowanie / D3DX11 i Visual Studio 2015
« dnia: 2016-01-07, 21:11 »
Wierz mi, że już wcześniej zmieniałem kodowanie i nic to nie dało (może zmieniałem w złej lokalizacji  :F ). Teraz pomogło. Niestety pojawił się drugi problem. Może zamiast go opisywać pokażę zrzut – będzie lepiej dla Was i dla mnie.


5
Programowanie / D3DX11 i Visual Studio 2015
« dnia: 2015-12-23, 21:11 »
Witam wszystkich!

Jakiś czas temu, zacząłem uczyć się DirectX 11. Doszedłem do momentu, w którym muszę skompilować prosty efekt. Bez względu na to jaka jest zawartość shader'a otrzymuje następujący błąd: [lokalizacja pliku](1,1): error X3000: Illegal character in shader file

Kompiluje efekt za pomocą funkcji D3DX11CompileFromFile i D3DX11CreateEffectFromMemory. Wina (raczej) nie może leżeć po stronie kodu, bo jest żywcem wzięty z książki (Frank Luna). Podejrzewam, że problem leży w mieszaniu Windows SDK i DirectX SDK. Podobno wiele się zmieniło i występują niespójności (d3dx11.h zostało wyłączone z zestawu Windows SDK).

Dołączam kod efektu (autorstwa Franka Luna):
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};

struct VertexIn
{
float3 PosL  : POSITION;
    float4 Color : COLOR;
};

struct VertexOut
{
float4 PosH  : SV_POSITION;
    float4 Color : COLOR;
};

VertexOut VS(VertexIn vin)
{
VertexOut vout;

vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);

    vout.Color = vin.Color;
   
    return vout;
}

float4 PS(VertexOut pin) : SV_Target
{
    return pin.Color;
}

technique11 ColorTech
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_5_0, VS() ) );
SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_5_0, PS() ) );
    }
}

Korzystam z Windows 7 (x64), Visual Studio 2015 i Windows SDK 8.1

6
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-10, 16:50 »
Ok, poczytam. Dzięki!

7
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-10, 16:18 »
Ważne że wszystko działa :P
Fartuess - kłaniam się  :bows: Brawo!

8
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-10, 15:57 »
Zmieniłem znaki w macierzach i działa. Dlaczego? Co miałem źle?

Cytuj
Po pierwsze zamień R z G(...)
Dlaczego? :D

BTW:
Cytuj
Odwrócenie znaków w macierzy wag da te same efekty co inwersja odpowiadającej mu pochodnej odpowiadającej temu samemu kierunkowi tj G_i = 255 - G_i. Ogólnie mówiąc nie ma znaczenia w którym miejscu zrobisz tego fixa.
Nie chodziło Ci o, np. Gx = -Gx? Bo mi wydaję się to działać.

9
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-09, 21:02 »
Cytuj
Odwrócenie znaków w macierzy wag da te same efekty co inwersja odpowiadającej mu pochodnej odpowiadającej temu samemu kierunkowi tj G_i = 255 - G_i. Ogólnie mówiąc nie ma znaczenia w którym miejscu zrobisz tego fixa.
Nie. Przynajmniej nie u mnie, może mam coś źle. Jak napiszę Gx = 255 - Gx, to normal mapa ma odcienie... turkusowe, a Gy = 255 - Gy różowe.

Cytuj
Podałem to wg matematycznej notacji macierzowej, czyli Mij, gdzie M to macierz, i to wiersz a j to kolumna. Z tego samego powodu indeksowałem od jedynki a nie od zera ;)
i - wiersz, j - kolumna:
w21: 2 wiersz, 1 kolumna:

|            |          |          |
|  tutaj  |           |         |
|            |          |          |

Napisałeś tak: Texture (x, y -1)*w21

                       tutaj
                          |
| (x-1,y-1)  | (x, y-1) | (x+1, y-1) |
| (x-1, y)     |   (x, y)   |  (x+1, y)  |
| (x-1,y+1) | (x,y+1) | (x+1,y+1) |

Pomyliłeś się ;)

10
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-09, 19:38 »
Nie, nie, nie. To odwróci mi kolorki. Bawiłem się wartościami Gx i Gy (to z macierzą) i udało mi się "dźwignąć" te doliny, odwracając znaki. Za to coś się sypnęło z orientacją w poziomie. Tu masz kod (wiem - dużo kodu, dało się w kilku linijkach):

int x11 = MinMax(i - 1, 0, b.Width - 1);int x12 = MinMax(i, 0, b.Width - 1);
int x13 = MinMax(i + 1, 0, b.Width - 1);
int y11 = MinMax(i2 - 1, 0, b.Height - 1);
int y12 = MinMax(i2 - 1, 0, b.Height - 1);
int y13 = MinMax(i2 - 1, 0, b.Height - 1);

int x21 = MinMax(i - 1, 0, b.Width - 1);
int x22 = MinMax(i, 0, b.Width - 1);
int x23 = MinMax(i + 1, 0, b.Width - 1);
int y21 = MinMax(i2, 0, b.Height - 1);
int y22 = MinMax(i2, 0, b.Height - 1);
int y23 = MinMax(i2, 0, b.Height - 1);

int x31 = MinMax(i - 1, 0, b.Width - 1);
int x32 = MinMax(i, 0, b.Width - 1);
int x33 = MinMax(i + 1, 0, b.Width - 1);
int y31 = MinMax(i2 + 1, 0, b.Height - 1);int y32 = MinMax(i2 + 1, 0, b.Height - 1);
int y33 = MinMax(i2 + 1, 0, b.Height - 1);


int v11 = b.GetPixel(x11, y11).R;
int v12 = b.GetPixel(x12, y12).R;
int v13 = b.GetPixel(x13, y13).R;
int v21 = b.GetPixel(x21, y21).R;
int v22 = b.GetPixel(x22, y22).R;
int v23 = b.GetPixel(x23, y23).R;
int v31 = b.GetPixel(x31, y31).R;
int v32 = b.GetPixel(x32, y32).R;
int v33 = b.GetPixel(x33, y33).R;

int Gx = -v11 - 2 * v12 - v13 + v31 + 2 * v32 + v33; //tu zmieniałem znaki
int Gy = -v11 + v13 - 2 * v21 + 2 * v23 - v31 + v33; //i tu
 
Ten "błąd" w Twoim poście z macierzami był celowy? Mam na myśli oznaczanie danych macierzy (kolumna, wiersz):
Cytuj
G = Texture(x-1, y-1)*w11 + Texture (x, y -1)*w21 + Texture(x+1, y-1) *w31+ ... Texture(x+1, y+1)*w33. 
(x, y-1) to środek górnego wiersza,  a w21 to pierwsza wartość drugiego wiersza :hmmm:

11
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-09, 15:55 »
Cytuj
 Otrzymujesz G_x i G_y. Jeśli masz je w przedziale np [0; 255] to przekształasz do [-1.0;1.0].
Tym mnie zmyliłeś :P Napisałem takie coś:
float x = (Gx - 127f) / 127f; //skalowanie do [-1,1]
float y = (Gy - 127f) / 127f; //j.w.float z = 1f;

Vector3 normal = new Vector3(y, x, z).Normalize(); //tutaj zamieniam kolorki - jak mówiłeś
normal /= 2;
normal += new Vector3(0.5f, 0.5f, 0.5f);

int cr = (int)(normal.X * 255);
int cg = (int)(normal.Y * 255);
int cb = (int)(normal.Z * 255);

Color c = Color.FromArgb(cr, cg, cb);
I wynikiem były takie ciemne kolory.

Zmieniłem na (reszta taka sama):
float x = Gx / 255f;
float y = Gy / 255f;
float z = 1f;
 
I mam takie coś:


Niby takie samo, ale jednak nie - tam gdzie ty masz szczyty, ja mam doliny :P O co chodzi?

Czy Gx i Gy mogą być ujemne?

12
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-08, 21:06 »
Też coś Ci nie pasuję?

Heightmap'a:


Wygenerowana normal map'a:

13
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-05, 22:39 »
Ok, a co jak jestem w punkcie (0, 0)? Liczb ujemnych nie może być. I czy zawsze z=1? Z czego to wynika?

14
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-05, 21:12 »
Ok, dajesz - najłatwiej jak się da  :D

15
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-05, 13:35 »
Cytuj
Tesalacja to zagęszczenie siatki. To co robisz na pikselach jest z tym niezwiązane.
To co ja robię, można porównać do interpolacji na FragmentShader. Wiem, że chodzi ci o zagęszczanie siatki. Problem w tym że, ja takiej w ogóle nie mam. Ogólnie to ten sposób na CPU chyba nie pójdzie.

Cytuj
Jak masz już normal mapę to nie potrzebujesz jej wyliczać z heightmapy, bo już masz normal mapę.
Mam "oryginalną" normalną płaskiej powierzchni, tj. (0, 0, 1), dla każdego piksela. I teraz chcę, żeby komputer wyobraził sobie że mam jakąś specyficzną powierzchnie opisaną bump mapą, w formie height mapy, tak by po jej interpretacji, na powierzchni płaskiej powstałaby iluzja wybitego napisu. Teraz rozumiesz? Nie wiem jak height mapę "skonwertować" na normal mapę i co będzie z tą starą wartością (oryginalną).

16
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-04, 19:29 »
No ja mam normal mapę. Nie potrzebne mi przeliczać z height mapy. Po prostu nie wiem co zrobić z bump mapą.

Teselacja to nie problem w mojej sytuacji, bo wykonując operację piksel po pikselu liczę współrzędną. Przypominam - mam płaską, jedną powierzchnię.

EDIT: Ok, teraz zrozumiałem . Bump mapa to nic nowego, a tylko oszukańcze wykorzystanie normal lub height mapy. A więc: mam height mape. Jak policzyć z tego normalną? Co z tą oryginalną? Uśrednić? Dodać? Pomnożyć?

17
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-04, 16:01 »
Wiem, że dużo oczekuje, ale chcę wyciągnąć z tematu najwięcej jak się da. Nie wykraczam poza regulamin - wszystko jest związane z "Oświetleniem 2D". Poza tym, ten temat może się przydać przyszłym pokoleniom "theModderatorów" - tyle wiedzy w jednym miejscu :P

Oczywiście czytałem o tym na wiki, ale tam wiedza jest przedstawiona w sposób zbyt ogólnikowy, nie ma powiedziane jak to zrobić tylko "upośledzone" co to jest. Dlatego pytam kogoś osobiście - tak zawsze jest lepiej.

Cytuj
Bump mapping to po prostu inna nazwa na normal mapping.
Z tego co ja czytałem to bump mapa opisuje, jakby przekształcenia normalnych. I teraz pytanie brzmi: Jak mają się kolory w odcieniach szarości do normalnych. Jak dobrze rozumiem mógłbym to potem "wypalić" na normal map'ie?

Hmm... displacement wygląda jakby unosił odpowiednie wierzchołki o odpowiednią wysokość. W After Effects zrobili to chyba po swojemu. Ale nieważne. Załóżmy że robię na GPU (mam taką możliwość), jak za to się zabrać, tak najłatwiej? A i dodam, że ciągle mówię o najprostszym chyba przypadku, kiedy to powierzchnia jest całkiem płaska, zwrócona do "widza" (normalna z monitora), to powinno ułatwić sprawę. Jeszcze tak z ciekawości da się displacement wypalić na normal mapę?

18
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-04-03, 21:30 »
OK, dzięki. Chyba już ostatnie pytanie: bump i displacement map. Co to jest i jak to zaimplementować/jak to działa? Zależałoby mi na efekcie zniekształceń, takich jak w After Effects, czyli raczej dwuwymiarowe (nie wiem czy w 3D też to tam działa). Ciekawi mnie też tzw. fake bump mapping.

19
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-03-30, 15:40 »
Reflection - odbijanie światła otoczenia, np. lustro. A co do flat shading - mam normalne dla każdego wierzchołka, zmapowanego z teksturą (UV map). W OpenGL'u mam tylko VertexShader i FragmentShader. Nie mogę dodać czegoś do VertexShader z myślą, że zostanie to wykonane TYLKO raz na ścianie. Nie o to chodzi. To ma być wydajne, więc operacje na każdym Vertex'ie nie wchodzą w grę. Mógłbym sprawdzać, czy operacja na wierzchołku danej ściany była wykonana, i zastosować wynik do pozostałych wierzchołków, ale to wydaję mi się trudniejsze niż Gouraud, czy Phong i minimalnie bardziej wydajne. 

20
Platforma .NET / [C#] Oświetlenie 2D
« dnia: 2015-03-29, 20:30 »
OK, a reflection i flat shading?

Strony: [1] 2 3 ... 14
Do góry