OpenGL Glulookat不与着色器一起使用
OpenGL gluLookat not working with shaders on
当我想使用glulookat并在上面放上着色器时,当我关闭着色器时,它不会移动"相机"。
我的着色器中缺少一些东西,我无法弄清楚。
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.8, 0.8, 0.8, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.5,0,1,0.5,0,0,0,1,0);
glColor3f(0, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDrawArrays(GL_LINES, 6, 6);
glDrawArrays(GL_TRIANGLES, 12,6);
glDrawArrays(GL_LINES, 18, 4);
glDrawArrays(GL_TRIANGLES, 22, 6);
glColor3f(1, 0.7, 0);
glDrawArrays(GL_TRIANGLES, 28, 6);
glFlush();
}
顶点着色器:
#version 450 core // 420, 330 core , compatibility
in vec4 position
out vec4 Color;
void main()
{
gl_Position = position;
}
碎片着色器:
#version 450 core // 420, 330 core , compatibility
in vec4 Color;
layout(location=0) out vec4 fColor;
void main()
{
fColor = vec4(0,0,0,0);
}
将"相机"移至我希望使用
使用着色器程序时,当前矩阵不会神奇地处理顶点坐标属性。着色器程序必须进行顶点坐标的转换。
拥有2种可能性,您要么使用兼容性配置文件上下文并使用较低的GLSL版本(例如1.10(。
然后,您可以使用内置的均匀gl_ModelViewProjectionMatrix
(请参阅GLSL 1.10 Secification(,固定功能矩阵堆栈将起作用:
#version 110
attribute vec4 position
// varying vec4 Color;
void main()
{
// ...
gl_Position = gl_ModelViewProjectionMatrix * position;
}
,但请注意,这是自数十年以来一直对此弃用的。请参阅固定功能管道和旧版OpenGL。
我建议使用诸如OpenGL数学之类的库来计算lookAt()
和统一变量的视图矩阵:
#version 450 core // 420, 330 core , compatibility
in vec4 position
// out vec4 Color;
layout(location = 7) uniform mat4 view_matrix;
void main()
{
gl_Position = view_matrix * position;
}
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
// [...]
{
// [...]
glUseProgram(program);
glm::mat4 view = glm::lookAt(
glm::vec3(0.5f,0.0f,1.0f), glm::Vec3(0.5f,0.0f,0.0f), glm::Vec3(0.0f,1.0f,0.0f));
glUniformMatrix4fv(7, 1, GL_FALSE, glm::value_ptr(view);
// [...]
}
统一位置由布局预选赛(location = 7
(显式设置。
glUniformMatrix4fv
在默认统一块中的指定位置设置了统一的值。这必须在glUseProgram
安装ProgRoam后必须完成。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- OpenGL Glulookat不与着色器一起使用