Browse Source

透视投影视锥体

master
blobt 4 years ago
parent
commit
55822599d4
  1. BIN
      .vs/shader2/v14/.suo
  2. 73
      frustum.cpp
  3. 14
      frustum.h
  4. 12
      main.cpp
  5. BIN
      res/image/camera.dds
  6. 3
      res/shader/WhiteColor.fs
  7. 9
      res/shader/WhiteColor.vs
  8. 4
      shader2.vcxproj
  9. 12
      shader2.vcxproj.filters

BIN
.vs/shader2/v14/.suo

73
frustum.cpp

@ -0,0 +1,73 @@
#include "frustum.h"
#include "misc.h"
Frustum::Frustum()
{
}
void Frustum::Init()
{
/*´´½¨program*/
mProgram = CreateGPUProgram("res/shader/WhiteColor.vs", "res/shader/WhiteColor.fs");
mPosLocation = glGetAttribLocation(mProgram, "pos");
mMLocation = glGetUniformLocation(mProgram, "M");
mVLocation = glGetUniformLocation(mProgram, "V");
mPLocation = glGetUniformLocation(mProgram, "P");
}
void Frustum::InitPerspective(float fov, float aspect, float zNear, float zFar)
{
//¼ÆËã½ü¼ô²ÃÃæ
float halfFOV = 22.5f;
float randianHalfFOV = 3.14*halfFOV / 180.0f;
float tanHalfFOV = sinf(randianHalfFOV) / cosf(randianHalfFOV);
float yNear = tanHalfFOV * zNear;
float xNear = yNear*aspect;
//¼ÆËãÔ¶¼ô²ÃÃæ
float yFar = tanHalfFOV * zFar;
float xFar = yFar*aspect;
float vertexes[24] = {
-xNear,-yNear,-zNear,
xNear,-yNear,-zNear,
xNear,yNear,-zNear,
-xNear,yNear,-zNear,
-xFar,-yFar,-zFar,
xFar,-yFar,-zFar,
xFar,yFar,-zFar,
-xFar,yFar,-zFar,
};
mVBO = CreateBufferObject(GL_ARRAY_BUFFER, sizeof(float)*24, GL_STATIC_DRAW, vertexes);
unsigned int indexes[] = {
0,1,1,2,2,3,3,0, //½ü¼ô²ÃÃæ
4,5,5,6,6,7,7,4, //Ô¶¼ô²ÃÃæ
0,4,3,7,2,6,1,5
};
mIBO = CreateBufferObject(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*24, GL_STATIC_DRAW, indexes);
}
void Frustum::Draw(float* M, float* V, float* P)
{
glUseProgram(mProgram);
glUniformMatrix4fv(mMLocation, 1, GL_FALSE, M);
glUniformMatrix4fv(mVLocation, 1, GL_FALSE, V);
glUniformMatrix4fv(mPLocation, 1, GL_FALSE, P);
glBindBuffer(GL_ARRAY_BUFFER, mVBO);
glEnableVertexAttribArray(mPosLocation);
glVertexAttribPointer(mPosLocation, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIBO);
glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glUseProgram(0);
}

14
frustum.h

@ -0,0 +1,14 @@
#pragma once
#include "glew.h"
#include "Glm/glm.hpp"
#include "Glm/ext.hpp"
class Frustum {
public:
GLuint mVBO, mIBO, mProgram;
GLint mPLocation, mVLocation, mMLocation, mPosLocation;
Frustum();
void Init();
void InitPerspective(float fov, float aspect, float zNear, float zFar);
void Draw(float* M, float* V, float* P);
};

12
main.cpp

@ -6,6 +6,7 @@
#include "misc.h"
#include "model.h"
#include "timer.h"
#include "frustum.h"
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib, "glew32.lib")
@ -126,7 +127,7 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
/*´´½¨ÎÆÀí*/
GLuint mainTexture = CreateTextureFromFile("res/image/stone.jpg");
GLuint secondTexture = CreateTextureFromDds("res/image/150001.dds");
GLuint secondTexture = CreateTextureFromDds("res/image/camera.dds");
glClearColor(0.1f, 0.4f, 0.7f, 1.0f);
glEnable(GL_DEPTH_TEST);
@ -142,10 +143,14 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
0,0,0,1
};
glm::mat4 model = glm::translate(0.0f, 0.0f, -4.0f);
glm::mat4 model = glm::translate(-1.0f, 0.0f, -3.0f)*glm::rotate(-20.0f, 0.0f, 1.0f, 0.0f);
glm::mat4 projection = glm::perspective(45.0f, (float)windowWidth / (float)windowHeight, 0.1f, 1000.0f);
glm::mat4 normalMatrix = glm::inverseTranspose(model);
Frustum frustum;
frustum.Init();
frustum.InitPerspective(45.0f, (float)windowWidth / (float)windowHeight, 0.1f, 4.0f);
/*ÏÔʾ´°¿Ú*/
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
@ -162,7 +167,7 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
glUniformMatrix4fv(PLocation, 1, GL_FALSE, glm::value_ptr(projection));
glUniformMatrix4fv(NMLocation, 1, GL_FALSE, glm::value_ptr(normalMatrix));
glBindTexture(GL_TEXTURE_2D, mainTexture);
glBindTexture(GL_TEXTURE_2D, secondTexture);
glUniform1i(textureLocation, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
@ -190,6 +195,7 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
frustum.Draw(glm::value_ptr(model), identify, glm::value_ptr(projection));
what();
SwapBuffers(dc);

BIN
res/image/camera.dds

3
res/shader/WhiteColor.fs

@ -0,0 +1,3 @@
void main() {
gl_FragColor =vec4(1.0);
}

9
res/shader/WhiteColor.vs

@ -0,0 +1,9 @@
attribute vec3 pos;
uniform mat4 M;
uniform mat4 V;
uniform mat4 P;
void main() {
gl_Position = P*V*M*vec4(pos,1.0);
}

4
shader2.vcxproj

@ -146,12 +146,14 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="frustum.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="misc.cpp" />
<ClCompile Include="model.cpp" />
<ClCompile Include="timer.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="frustum.h" />
<ClInclude Include="misc.h" />
<ClInclude Include="model.h" />
<ClInclude Include="timer.h" />
@ -159,6 +161,8 @@
<ItemGroup>
<None Include="res\shader\PointSprite.fs" />
<None Include="res\shader\PointSprite.vs" />
<None Include="res\shader\WhiteColor.fs" />
<None Include="res\shader\WhiteColor.vs" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

12
shader2.vcxproj.filters

@ -27,6 +27,9 @@
<ClCompile Include="timer.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="frustum.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="misc.h">
@ -38,8 +41,17 @@
<ClInclude Include="timer.h">
<Filter>源文件</Filter>
</ClInclude>
<ClInclude Include="frustum.h">
<Filter>源文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="res\shader\WhiteColor.fs">
<Filter>源文件</Filter>
</None>
<None Include="res\shader\WhiteColor.vs">
<Filter>源文件</Filter>
</None>
<None Include="res\shader\PointSprite.fs">
<Filter>源文件</Filter>
</None>

Loading…
Cancel
Save