저는 최근에 OpenTK로 작업하기 시작했습니다. 그리고 언제나처럼 OpenGL을 사용하기 때문에 설정에 좌절감을 느낍니다. 내 코드는 지금 당장 다소 혼란 스럽지만 누구나이 정사영 투영을 사용하여 출력이 왜 공백 (배경색)인지 알 수 있습니까?직교 투영이 아무 것도 표시하지 않는 이유는 모르겠지만 아무도 도와 줄 수 있습니까? (OpenTK)
Render() 함수에 대한 외부 호출은 작동하며 현재 출처를 중심으로 쿼드를 렌더링합니다. 코드에서 원근감 투영 예제를 사용하면 형상이 표시되지만 이는 내 목표가 아닙니다.
쉐이더에 대한 정보를 무시합니다. 실제로는 실제로 사용되지 않습니다. 당신이 직교 카메라를 원하는 경우
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Genesis
{
class Game : GameWindow
{
public static Game Inst;
public Matrix4 ModelViewMatrix;
public Matrix4 ProjectionMatrix;
private int ShaderProgram;
private int VertexShader;
private int FragmentShader;
float rot = 0;
public GameObject Selector;
public Multiblock BaseIsland;
private List<GameObject> gameObjects = new List<GameObject>();
public Game()
: base(1000, 650, GraphicsMode.Default, Strings.WINDOW_TITLE)
{
VSync = VSyncMode.On;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
GL.ClearColor(0.0f, 0.8f, 0.8f, 0.0f);
GL.Enable(EnableCap.Texture2D);
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
GL.Enable(EnableCap.DepthTest);
ShaderProgram = GL.CreateProgram();
VertexShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(VertexShader, ShaderSource.Vertex_Default);
GL.CompileShader(VertexShader);
FragmentShader = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(FragmentShader, ShaderSource.Fragment_Default);
GL.CompileShader(FragmentShader);
GL.LinkProgram(ShaderProgram);
//GL.UseProgram(ShaderProgram);
Assets.Init();
Blocks.Init();
//INIT
BaseIsland = new Multiblock("Base Island", 7, 7);
for(int x = 2; x <= 4; x++)
{
BaseIsland.SetBlock(x, 0, Blocks.BLOCK_DIRT);
}
for (int x = 1; x <= 5; x++)
{
BaseIsland.SetBlock(x, 1, Blocks.BLOCK_DIRT);
}
for (int x = 0; x < 7; x++)
{
BaseIsland.SetBlock(x, 2, Blocks.BLOCK_GRASS);
}
for (int y = 3; y < 7; y++)
{
BaseIsland.SetBlock(3, y, Blocks.BLOCK_STONE);
}
BaseIsland.SetBlock(2, 5, Blocks.BLOCK_STONE);
BaseIsland.SetBlock(4, 5, Blocks.BLOCK_STONE);
Selector = new GameObject(Assets.UI_SELECTOR);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
//ProjectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI/4, Width/(float)Height, 1.0f, 64.0f);
ProjectionMatrix = Matrix4.CreateOrthographic(Width, Height, 1.0f, 100.0f);
Console.WriteLine(ProjectionMatrix);
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.LoadMatrix(ref ProjectionMatrix);
}
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
if (Keyboard[Key.Escape])
Exit();
//TileSelection sel = Input.GetSelectedTile();
Vector2 mousePos = Input.GetMousePosition();
float sx = (mousePos.X * Constants.GLOBAL_SCALE)/(Constants.PIXELS_PER_UNIT * 0.83f);
float sy = (mousePos.Y * Constants.GLOBAL_SCALE)/(Constants.PIXELS_PER_UNIT * 0.83f);
Selector.Transform.SetPosition(sx, sy);
//Console.WriteLine("ProjectionMatrix");
//Console.WriteLine(ProjectionMatrix);
rot = (rot + 1.0f) % 360;
Console.WriteLine(rot);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
ModelViewMatrix = Matrix4.LookAt(Vector3.Zero, -Vector3.UnitZ, Vector3.UnitY);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
GL.LoadMatrix(ref ModelViewMatrix);
GL.Rotate(rot, 0, 1, 0);
GL.Translate(0, 0, -5);
GL.Scale(Constants.GLOBAL_SCALE, Constants.GLOBAL_SCALE, 1);
//GL.UseProgram(ShaderProgram);
for (int i = gameObjects.Count - 1; i >= 0; i--)
{
GL.PushMatrix();
gameObjects[i].Render();
GL.PopMatrix();
}
SwapBuffers();
}
public void OnGameObjectCreated(GameObject obj)
{
gameObjects.Add(obj);
Console.WriteLine("GAMEOBJECT CREATED: " + obj.Name + " - " + obj.Texture);
}
public void OnGameObjectDestroyed(GameObject obj)
{
gameObjects.Remove(obj);
}
[STAThread]
static void Main()
{
using (Game game = new Game())
{
Game.Inst = game;
game.Run(30.0);
Game.Inst = null;
}
}
}
}
분명히하기 위해, 나는 기하학이 여전히 어딘가에 렌더링되고 있다는 것을 안다. 뷰포트 내에 형상이 나타나도록 (올바르게 변형 된) 형상을 올바르게 구성하는 방법을 모르겠습니다. – Arkathorn