Я пытаюсь отобрать 3D -диск на окне и наблюдать за прогрессивной проекцией.
в шейдере вершины, когда я не умножаю проекционную матрицу, куб получается (но вы не можете наблюдать за проспективной проекцией). Когда я умножаю перспективную проекционную матрицу, куб, кажется, слишком увеличен или просто черное окно. CPP ниже; < /p>
//Vertex Shader
#version 420 core
layout (location = 0) in vec3 pos;
out vec4 col;
uniform mat4 model;
uniform mat4 projection;
void main(){
gl_Position = model *projection* vec4(pos,1.0f);
col = vec4(clamp(pos, 0.1f, 100.0f), 1.0f);
}
< /code>
#include
#include
#include
#include
#include
#include
#include
#include
#include "Window.h"
#include "Shader.h"
#include "Buffers.h"
#include "Camera.h"
Window window;
std::vector bufferList;
std::vector shaderList;
static const char* vShader = "Shaders/shader.vert";
static const char* fShader = "Shaders/shader.frag";
void CreateObjects() {
GLfloat Cubevertices[] = {
1.0f,1.0f,1.0f, //0
-1.0f,1.0f,1.0f, //1
1.0f,-1.0f,1.0f, //2
-1.0f,-1.0f,1.0f, //3
1.0f,1.0f,-1.0f, //4
-1.0f,1.0f,-1.0f, //5
-1.0f,-1.0f,-1.0f, //6
1.0f,-1.0f,-1.0f, //7
};
unsigned int Cubeindices[] = {
0,1,3,
3,0,2,
3,2,6,
6,7,2,
1,3,5,
5,6,3,
0,1,4,
4,5,1,
2,0,7,
7,4,0,
5,6,4,
4,7,6
};
Buffers* obj1 = new Buffers();
obj1->CreateBuffer(Cubevertices, Cubeindices, 24, 36); //24 36
bufferList.push_back(obj1);
}
void CreateShaders() {
Shader* shader1 = new Shader();
shader1->createFromFiles(vShader, fShader);
shaderList.push_back(*shader1);
}
GLfloat toRad = 3.14159265359f/180.0f;
GLfloat r_angle = 0.0f;
bool direction = true;
float offset = 0.0f;
float maxoffset = 0.7f;
float inc = 0.0005f;
float cursize = 0.5f;
bool sizedir = true;
int main() {
window = Window(500, 500, "Cube");
window.Initialize();
CreateObjects();
CreateShaders();
GLuint u_model = 0, u_project = 0, u_view = 0;
glm::mat4 projection = glm::perspective(glm::radians(10.0f), (GLfloat)window.getBufferWidth() / window.getBufferHeight(), 1.0f, 100.0f);
while (!window.windowClose()) {
glfwPollEvents();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
shaderList[0].UseShader();
u_model = shaderList[0].getUniformModelLocation();
u_project = shaderList[0].getProjectionModelLocation();
glm::mat4 model(1.0f);
//TRANSLATION
if (direction) {
offset += inc;
}
else {
offset -= inc;
}
if (abs(offset) >= maxoffset) {
direction = !direction;
}
model = glm::scale(model, glm::vec3(0.3f, 0.3f, 0.3f));
model = glm::translate(model, glm::vec3(0.0f, offset, 0.0f));
model = glm::rotate(model, toRad*45.0f, glm::vec3(1.0f, 1.0f, 1.0f));
glUniformMatrix4fv(u_project, 1, GL_FALSE, glm::value_ptr(projection));
glUniformMatrix4fv(u_model, 1, GL_FALSE, glm::value_ptr(model));
bufferList[0]->Render();
window.swapBuffers();
}
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... y-opengl-c
Перспективная проекция не работает должным образом OpenGL C ++ ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1740330842
Anonymous
Я пытаюсь отобрать 3D -диск на окне и наблюдать за прогрессивной проекцией.
в шейдере вершины, когда я не умножаю проекционную матрицу, куб получается (но вы не можете наблюдать за проспективной проекцией). Когда я умножаю перспективную проекционную матрицу, куб, кажется, [b] слишком увеличен [/b] или просто черное окно. CPP ниже; < /p>
//Vertex Shader
#version 420 core
layout (location = 0) in vec3 pos;
out vec4 col;
uniform mat4 model;
uniform mat4 projection;
void main(){
gl_Position = model *projection* vec4(pos,1.0f);
col = vec4(clamp(pos, 0.1f, 100.0f), 1.0f);
}
< /code>
#include
#include
#include
#include
#include
#include
#include
#include
#include "Window.h"
#include "Shader.h"
#include "Buffers.h"
#include "Camera.h"
Window window;
std::vector bufferList;
std::vector shaderList;
static const char* vShader = "Shaders/shader.vert";
static const char* fShader = "Shaders/shader.frag";
void CreateObjects() {
GLfloat Cubevertices[] = {
1.0f,1.0f,1.0f, //0
-1.0f,1.0f,1.0f, //1
1.0f,-1.0f,1.0f, //2
-1.0f,-1.0f,1.0f, //3
1.0f,1.0f,-1.0f, //4
-1.0f,1.0f,-1.0f, //5
-1.0f,-1.0f,-1.0f, //6
1.0f,-1.0f,-1.0f, //7
};
unsigned int Cubeindices[] = {
0,1,3,
3,0,2,
3,2,6,
6,7,2,
1,3,5,
5,6,3,
0,1,4,
4,5,1,
2,0,7,
7,4,0,
5,6,4,
4,7,6
};
Buffers* obj1 = new Buffers();
obj1->CreateBuffer(Cubevertices, Cubeindices, 24, 36); //24 36
bufferList.push_back(obj1);
}
void CreateShaders() {
Shader* shader1 = new Shader();
shader1->createFromFiles(vShader, fShader);
shaderList.push_back(*shader1);
}
GLfloat toRad = 3.14159265359f/180.0f;
GLfloat r_angle = 0.0f;
bool direction = true;
float offset = 0.0f;
float maxoffset = 0.7f;
float inc = 0.0005f;
float cursize = 0.5f;
bool sizedir = true;
int main() {
window = Window(500, 500, "Cube");
window.Initialize();
CreateObjects();
CreateShaders();
GLuint u_model = 0, u_project = 0, u_view = 0;
glm::mat4 projection = glm::perspective(glm::radians(10.0f), (GLfloat)window.getBufferWidth() / window.getBufferHeight(), 1.0f, 100.0f);
while (!window.windowClose()) {
glfwPollEvents();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
shaderList[0].UseShader();
u_model = shaderList[0].getUniformModelLocation();
u_project = shaderList[0].getProjectionModelLocation();
glm::mat4 model(1.0f);
//TRANSLATION
if (direction) {
offset += inc;
}
else {
offset -= inc;
}
if (abs(offset) >= maxoffset) {
direction = !direction;
}
model = glm::scale(model, glm::vec3(0.3f, 0.3f, 0.3f));
model = glm::translate(model, glm::vec3(0.0f, offset, 0.0f));
model = glm::rotate(model, toRad*45.0f, glm::vec3(1.0f, 1.0f, 1.0f));
glUniformMatrix4fv(u_project, 1, GL_FALSE, glm::value_ptr(projection));
glUniformMatrix4fv(u_model, 1, GL_FALSE, glm::value_ptr(model));
bufferList[0]->Render();
window.swapBuffers();
}
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79460666/perspective-projection-not-working-properly-opengl-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия