いつもお世話になっております。
MakeScreenで作ったテクスチャを、以下の2通りで表示しようとしています。
1. DrawGraphで表示
2. DrawPolygonIndexed3DToShaderで、画像がそのまま表示されるようなシェーダで表示
しかし、以下のような乱れが生じてしまいます。
1. で表示した場合
https://i.imgur.com/lFVlemR.png
2. で表示した場合
https://i.imgur.com/mc2XF6f.png
これはどういった原因から起こるのでしょうか。申し訳ありませんが、調査いただきたく存じます。
プログラムは以下となります。
--------------
C++ プログラム
--------------
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE);
SetUseDirect3DVersion(DX_DIRECT3D_9);
if (DxLib_Init() == -1) {
return -1;
}
// プロジェクション空間において、画面いっぱいに描画するためのポリゴン2つを初期化する。
VERTEX3DSHADER vertex[4];
// w[1] w[0]
// w[2] w[3]
VECTOR w[4] = {
VGet(+1.0f, +1.0f, 0.0f),
VGet(-1.0f, +1.0f, 0.0f),
VGet(-1.0f, -1.0f, 0.0f),
VGet(+1.0f, -1.0f, 0.0f),
};
// pos以外のメンバは使わないので0初期化
for (int i = 0; i < 4; i++) {
vertex[i].pos = w[i];
vertex[i].spos = FLOAT4({ 0, 0, 0, 0 });
vertex[i].norm = VGet(0, 0, 0);
vertex[i].tan = VGet(0, 0, 0);
vertex[i].binorm = VGet(0, 0, 0);
vertex[i].dif = GetColorU8(0, 0, 0, 0);
vertex[i].spc = GetColorU8(0, 0, 0, 0);
vertex[i].u = 0;
vertex[i].v = 0;
vertex[i].su = 0;
vertex[i].sv = 0;
}
unsigned short index[6] = { 0, 1, 2, 2, 3, 0 };
// ピクセルの乱れと向きが分かるようなテクスチャを作る。
int rx = DEFAULT_SCREEN_SIZE_X, ry = DEFAULT_SCREEN_SIZE_Y;
int random_texture = MakeScreen(rx, ry, false);
SetDrawScreen(random_texture);
for (int x = 0; x < rx; x++) {
for (int y = 0; y < ry; y++) {
if ((x + y) / 4 % 2 == 0) {
DrawPixel(x, y, GetColor(x / (float)rx * 255, y / (float)ry * 255, 255));
}
else {
DrawPixel(x, y, GetColor(0, 0, 0));
}
}
}
SetDrawScreen(DX_SCREEN_BACK);
// シェーダを読み込む
int VertexShaderHandle = LoadVertexShader("shader/bin/projection_vs.vso");
int PixelShaderHandle = LoadPixelShader("shader/bin/ssao3_ps.pso");
SetUseVertexShader(VertexShaderHandle);
SetUsePixelShader(PixelShaderHandle);
SetUseTextureToShader(1, random_texture);
// 描画する
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)) {
// →を押したらニアレスト描画
if (CheckHitKey(KEY_INPUT_RIGHT)) {
SetDrawMode(DX_DRAWMODE_NEAREST);
DrawPolygonIndexed3DToShader(vertex, 4, index, 2);
}
// ←を押したらバイリニア描画
else if (CheckHitKey(KEY_INPUT_LEFT)) {
SetDrawMode(DX_DRAWMODE_BILINEAR);
DrawPolygonIndexed3DToShader(vertex, 4, index, 2);
}
// それ以外なら自作シェーダを使わずに描画
else {
DrawGraph(0, 0, random_texture, true);
}
}
return DxLib_End();
}
--------------
頂点シェーダー
--------------
// 頂点シェーダーの出力
struct VS_OUTPUT {
float4 ProjectionPosition : POSITION; // 座標( 射影空間 )
float2 TextureCoord0 : TEXCOORD0; // テクスチャ座標
};
// main関数
VS_OUTPUT main(float4 VPos : POSITION) {
VS_OUTPUT Out;
Out.ProjectionPosition = VPos;
Out.TextureCoord0.x = (+VPos.x + 1.0f) / 2.0f;
Out.TextureCoord0.y = (-VPos.y + 1.0f) / 2.0f;
return Out;
}
--------------
ピクセルシェーダー
--------------
sampler ssao_texture : register(s1);
float4 main(float2 uv : TEXCOORD0) : COLOR {
return tex2D(ssao_texture, uv);
}