Я пытаюсь разместить 3D-объект, используя координаты экрана. Это означает, что я хочу написать функцию, например show3DObject, для отображения объекта, например, в позиции x при 250 и позиции y при 520 (мой размер экрана 1920x1080).
glm::vec3 CImage::show3DObject(float x, float y)
{
float screenW = 1920;
float screenH = 1080;
float xPosition = x;
float yPosition = y;
xPosition = xPosition * 2 / screenW - 1;
yPosition = yPosition * (-2 / screenH) + 1;
glm::vec4 viewport = glm::vec4(0.0f, 0.0f, screenW, screenH);
glm::mat4 projectionMatrix = glm::ortho(0.0f, screenW, screenH, 0.0f, -1.0f, 1.0f);
glm::mat4 model = glm::mat4(1.0f);
glm::vec2 pixel_pos = glm::vec2(xPosition, screenH - yPosition);
glm::vec3 world = glm::unProject(glm::vec3(pixel_pos, 0), model, projectionMatrix, viewport);
return world;
}
Я использую ассимп для загрузить 3D-объекты с помощью OpenGL 3.3. Windows 10.0 Visual Studio 2017.
Вот мой вершинный шейдер:
#version 330
layout(std140) uniform Matrices
{
mat4 projMatrix;
mat4 viewMatrix;
mat4 modelMatrix;
};
in vec3 position;
in vec3 normal;
in vec2 texCoord;
out vec4 vertexPos;
out vec2 TexCoord;
out vec3 Normal;
void main()
{
Normal = normalize(vec3(viewMatrix * modelMatrix *
vec4(normal,0.0)));
TexCoord = vec2(texCoord);
gl_Position = projMatrix * viewMatrix * modelMatrix *
vec4(position,1.0);
};
Вот мой фрагментный шейдер:
#version 330
layout (std140) uniform Material
{
vec4 diffuse;
vec4 ambient;
vec4 specular;
vec4 emissive;
float shininess;
int texCount;
};
uniform sampler2D texUnit;
uniform int renderType;
in vec3 Normal;
in vec2 TexCoord;
out vec4 output;
void main()
{
vec4 color;
vec4 amb;
float intensity;
vec3 lightDir;
vec3 n;
lightDir = normalize(vec3(0.0,0.0,0.0));
n = normalize(Normal);
intensity = max(dot(lightDir,n),0.0);
color = texture(texUnit, TexCoord);
amb = color * 0.99;
output = (color * intensity) + amb;
};