3Dで線を描いてアナグリフみたいなものを作ろうとしています。SaveDrawScreenで画像をずらして、赤と青で2つ保存して、その画像をブレンドで合成します。
これを繰り返すと処理が重くなって、とまってしまいます。
SaveDrawScreenを繰り返すと重くなりますか?
処理が重くなります
Re:処理が重くなります
遅れてすいません
ソースはこちらです。長いようなので2分割させていただきます。
2のボタンを押したときは連続で赤と青を繰り返すためちかちかします。
それを直そうと思ってbmpに保存してやろうと思いました。
#include "DxLib.h"
#include<stdio.h>
#include <math.h>
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
int x=0,y=0,z=0; //位置
int i=0,j=0,k=0,Pos_z=0,mode=1; //カウント その他
int White,Red,Blue;
White = GetColor(255,255,255);
Red = GetColor(255,0,0);
Blue = GetColor(0,0,255);
float Roll_x, Roll_y, Roll_z ;
Roll_x = 0.0f ;
Roll_y = 0.0f ;
Roll_z = 0.0f ;
VECTOR CameraPos ;
// カメラの座標を初期化
CameraPos.x = 0.0f ;
CameraPos.y = 0.0f ;
CameraPos.z = -400.0f ;
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
// 方向キーでカメラの座標を移動
if(Key[ KEY_INPUT_LSHIFT]==1){
if( Key[ KEY_INPUT_UP] == 1 )
{
Roll_y += PHI_F / 60.0f;
Roll_z += PHI_F / 60.0f;
}
if(Key[ KEY_INPUT_DOWN] == 1 )
{
Roll_y -= PHI_F / 60.0f;
Roll_z -= PHI_F / 60.0f;
}
if( Key[ KEY_INPUT_LEFT] == 1 )
{
Roll_x += PHI_F / 60.0f;
Roll_z += PHI_F / 60.0f;
}
if( Key[ KEY_INPUT_RIGHT] == 1 )
{
Roll_x -= PHI_F / 60.0f;
Roll_z -= PHI_F / 60.0f;
}
}
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
ChangeLightTypeDir( VGet( -1.0f * sin(Roll_x), -1.0f * sin(Roll_y) , 1*cos(Roll_z) ) ) ;
// カメラの位置と注視点をセット、注視点は原点
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
//mode変化
if(Key[KEY_INPUT_1]==1)
mode=1;
if(Key[KEY_INPUT_2]==1)
mode=2;
if(Key[KEY_INPUT_3]==1)
mode=3;
if(mode==1){
//カプセル描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,White, White, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,White, White, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,White, White, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8,White, White, TRUE ) ;
ScreenFlip() ;
}

ソースはこちらです。長いようなので2分割させていただきます。
2のボタンを押したときは連続で赤と青を繰り返すためちかちかします。
それを直そうと思ってbmpに保存してやろうと思いました。
#include "DxLib.h"
#include<stdio.h>
#include <math.h>
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
int x=0,y=0,z=0; //位置
int i=0,j=0,k=0,Pos_z=0,mode=1; //カウント その他
int White,Red,Blue;
White = GetColor(255,255,255);
Red = GetColor(255,0,0);
Blue = GetColor(0,0,255);
float Roll_x, Roll_y, Roll_z ;
Roll_x = 0.0f ;
Roll_y = 0.0f ;
Roll_z = 0.0f ;
VECTOR CameraPos ;
// カメラの座標を初期化
CameraPos.x = 0.0f ;
CameraPos.y = 0.0f ;
CameraPos.z = -400.0f ;
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
// 方向キーでカメラの座標を移動
if(Key[ KEY_INPUT_LSHIFT]==1){
if( Key[ KEY_INPUT_UP] == 1 )
{
Roll_y += PHI_F / 60.0f;
Roll_z += PHI_F / 60.0f;
}
if(Key[ KEY_INPUT_DOWN] == 1 )
{
Roll_y -= PHI_F / 60.0f;
Roll_z -= PHI_F / 60.0f;
}
if( Key[ KEY_INPUT_LEFT] == 1 )
{
Roll_x += PHI_F / 60.0f;
Roll_z += PHI_F / 60.0f;
}
if( Key[ KEY_INPUT_RIGHT] == 1 )
{
Roll_x -= PHI_F / 60.0f;
Roll_z -= PHI_F / 60.0f;
}
}
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
ChangeLightTypeDir( VGet( -1.0f * sin(Roll_x), -1.0f * sin(Roll_y) , 1*cos(Roll_z) ) ) ;
// カメラの位置と注視点をセット、注視点は原点
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
//mode変化
if(Key[KEY_INPUT_1]==1)
mode=1;
if(Key[KEY_INPUT_2]==1)
mode=2;
if(Key[KEY_INPUT_3]==1)
mode=3;
if(mode==1){
//カプセル描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,White, White, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,White, White, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,White, White, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8,White, White, TRUE ) ;
ScreenFlip() ;
}

Re:処理が重くなります
//アナグリフっぽいの
else if(mode==2){
// ずらして青いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Blue,Blue, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Blue, Blue, TRUE ) ;
//左にずらして保存
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
ScreenFlip() ;
//SaveDrawScreen( 0 , 0 , 640 , 480 , "Save1.bmp" ) ;
ClearDrawScreen();
// ずらして赤いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Red,Red, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Red, Red, TRUE ) ;
//右にずらして保存
Roll_x += PHI_F / 25.0f;
Roll_z += PHI_F / 25.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
ScreenFlip() ;
//SaveDrawScreen( 0 , 0 , 640 , 480 , "Save2.bmp" ) ;
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
}
//
else if(mode==3){
// ずらして青いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Blue,Blue, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Blue, Blue, TRUE ) ;
//左にずらして保存
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
SaveDrawScreen( 0 , 0 , 640 , 480 , "Save1.bmp" ) ;
ClearDrawScreen();
// ずらして赤いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Red,Red, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Red, Red, TRUE ) ;
//右にずらして保存
Roll_x += PHI_F / 25.0f;
Roll_z += PHI_F / 25.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
SaveDrawScreen( 0 , 0 , 640 , 480 , "Save2.bmp" ) ;
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
ClearDrawScreen();
// 描画ブレンドモードをノーブレンドにする
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
DrawGraph( 0 , 0 , LoadGraph( "Save1.bmp" ) , FALSE ) ;
// 描画ブレンドモードを加算ブレンド(100%)にする
SetDrawBlendMode( DX_BLENDMODE_ADD , 255 ) ;
DrawGraph( 0 , 0 , LoadGraph( "Save2.bmp" ) , TRUE ) ;
ScreenFlip() ;
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
}
}
DxLib_End();
return 0;
}
else if(mode==2){
// ずらして青いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Blue,Blue, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Blue, Blue, TRUE ) ;
//左にずらして保存
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
ScreenFlip() ;
//SaveDrawScreen( 0 , 0 , 640 , 480 , "Save1.bmp" ) ;
ClearDrawScreen();
// ずらして赤いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Red,Red, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Red, Red, TRUE ) ;
//右にずらして保存
Roll_x += PHI_F / 25.0f;
Roll_z += PHI_F / 25.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
ScreenFlip() ;
//SaveDrawScreen( 0 , 0 , 640 , 480 , "Save2.bmp" ) ;
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
}
//
else if(mode==3){
// ずらして青いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Blue,Blue, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Blue, Blue, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Blue, Blue, TRUE ) ;
//左にずらして保存
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
SaveDrawScreen( 0 , 0 , 640 , 480 , "Save1.bmp" ) ;
ClearDrawScreen();
// ずらして赤いろ描写
DrawCapsule3D( VGet( 20, 50, 70), VGet( -80,-90, -40), 20.0f, 8,Red,Red, TRUE ) ;
DrawCapsule3D( VGet( 70, -50, 100), VGet( -60,90, -150), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( -320, 120, 370), VGet( 60,90, 240), 20.0f, 8,Red, Red, TRUE ) ;
DrawCapsule3D( VGet( 30, 30, 30), VGet( -30,-30, -30), 20.0f, 8, Red, Red, TRUE ) ;
//右にずらして保存
Roll_x += PHI_F / 25.0f;
Roll_z += PHI_F / 25.0f;
CameraPos.x = 400.0f * sin(Roll_x) ;
CameraPos.y = 400.0f * sin(Roll_y) ;
CameraPos.z = -400.0f * cos(Roll_z) ;
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
SaveDrawScreen( 0 , 0 , 640 , 480 , "Save2.bmp" ) ;
Roll_x -= PHI_F / 50.0f;
Roll_z -= PHI_F / 50.0f;
ClearDrawScreen();
// 描画ブレンドモードをノーブレンドにする
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
DrawGraph( 0 , 0 , LoadGraph( "Save1.bmp" ) , FALSE ) ;
// 描画ブレンドモードを加算ブレンド(100%)にする
SetDrawBlendMode( DX_BLENDMODE_ADD , 255 ) ;
DrawGraph( 0 , 0 , LoadGraph( "Save2.bmp" ) , TRUE ) ;
ScreenFlip() ;
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
}
}
DxLib_End();
return 0;
}