我正在尝试在openGL中编译一个非常简单的程序:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
using namespace glm;
int main()
{
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n");
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // Use OpenGL 3.X
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // Use openGL X.3
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// Open a window and create OpenGL context
GLFWwindow* window; // May be needed to make it global
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
if(window == NULL) …Run Code Online (Sandbox Code Playgroud) 我目前正在Windows上学习OpenGL,有一些我不明白的东西.如果我想调用类似的函数glShaderSource,除非我链接GLEW,否则它是未定义的.但是,一旦我链接GLEW并调用glewInit,glShaderSource就会突然定义并可以使用.使用GLEW显式加载需要哪些函数,以及在初始化GLEW后自动加载哪些函数?
我是OpenGL的新手,我很期待比较两种纹理,以了解它们彼此之间的相似程度。我知道如何使用两个位图图像来实现此目的,但我确实需要使用一种方法来比较两个纹理。
问题是:当我们比较两个图像时,有什么方法可以比较两个纹理吗?像一个像素一个像素地比较两个图像?
假设我有一个游戏,在openGL方面做了很多图形,我有一个安装了Linux 32位的桌面,配有4GB内存和1G Nvidia显卡.我的游戏应用程序虚拟地址空间如何?显卡内存是否映射在此虚拟地址空间中?
此外,RAM和显卡内存之间是否存在某种关系?linux是否为显卡分配了相同的RAM,任何进程都无法使用?也就是说,它导致我的游戏进程只有3GB的RAM可用?
假设我想在两个视口中渲染OpenGL场景.第一个视口渲染彩色图像,第二个视口渲染深度图像.每个都有自己的顶点着色器和片段着色器,每个都有自己的着色器程序.着色器类似,唯一的区别是对于彩色图像,顶点着色基于顶点法线在顶点着色器中定义,而对于深度图像,顶点颜色基于顶点深度在片段着色器中定义.要执行渲染,我glUseProgram()是颜色着色器程序,然后绘制颜色场景,然后glUseProgram()绘制深度着色器程序,并绘制深度场景.
我不确定的是,glClear()当有两个着色器程序时,它是如何工作的.我是否需要在每个渲染循环中调用它两次 - 一次在渲染彩色图像之前,一次在渲染深度图像之前?当我只召唤一次它似乎工作,但这对我来说似乎很奇怪.我原以为每个着色器程序一次写入颜色和深度缓冲区.因此,在渲染深度图像时,它会留下渲染彩色图像的缓冲区......但似乎并非如此.有人可以向我解释一下吗?谢谢!
我最近制作了第一个渲染立方体的OpenGL程序,我将其扩展到包括一些其他基本功能(旋转,缩放,平移,鼠标选择顶点).但是,我认为该程序使用的是某些版本的OpenGL ES xx,因为我无法使用glReadPixels和gl_depth_component来启用鼠标选择仅可见顶点.
为了解决这个问题,我修改了我的旧程序,在我的main函数中手动指定默认的表面格式为OpenGL 3.0版,但是现在程序在尝试创建GLWidget实例时会抛出以下错误.
宣扬: "QOpenGLFunctions ::将IsInitialized(应将d_ptr)"
我的主要功能(main.cpp):
#include "mainwindow.h"
#include <QApplication>
#include <QOpenGLFunctions>
int main(int argc, char *argv[])
{
QSurfaceFormat format;
format.setSamples(16);
format.setDepthBufferSize(24);
format.setVersion(3,0);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat( format);
QApplication a(argc, argv);
MainWindow w; //breakpoint here - step into
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
进入这个断点会引导我进入我的MainWindow构造函数(mainwindow.cpp):
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); //breakpoint here - step into
ui->GLwidget2->getmainwindowpointer(this);
connect(ui->actionTop,SIGNAL(triggered()),ui->GLwidget2,SLOT(settopview()));
connect(ui->actionRight, SIGNAL(triggered()), ui->GLwidget2, SLOT(setrightview()));
connect(ui->actionIso,SIGNAL(triggered()),ui->GLwidget2,SLOT(setisoview()));
//connect(ui->checkBox_perspective,SIGNAL(released()),ui->GLwidget2,SLOT(setperspective()));
connect(ui->checkBox_legend, SIGNAL(released()), ui->GLwidget2, SLOT(setlegend()));
connect(ui->checkBox_edges, SIGNAL(released()), ui->GLwidget2, SLOT(setedges()));
connect(ui->checkBox_faces, SIGNAL(released()), ui->GLwidget2, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在OpenGL中扩展模型,但我不知道从哪里开始,我正在尝试使用glScalef(),但我不知道是否有这种方式,我不知道很多关于openGL,我更了解理论(那我必须用矩阵乘以我的向量,但我没有找到任何关于此的好教程... ...我的代码是:
bool res = loadOBJ(object, vertices, uvs, normals);
indexVBO(vertices, uvs, normals, indices, indexed_vertices, indexed_uvs, indexed_normals);
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, indexed_vertices.size() * sizeof(glm::vec3), &indexed_vertices[0], GL_STATIC_DRAW);
glGenBuffers(1, &uvbuffer);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER, indexed_uvs.size() * sizeof(glm::vec2), &indexed_uvs[0], GL_STATIC_DRAW);
glGenBuffers(1, &normalbuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glBufferData(GL_ARRAY_BUFFER, indexed_normals.size() * sizeof(glm::vec3), &indexed_normals[0], GL_STATIC_DRAW);
// Generate a buffer for the indices as well
glGenBuffers(1, &elementbuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned short), &indices[0], GL_STATIC_DRAW);
// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0, // attribute
3, …Run Code Online (Sandbox Code Playgroud) 我正在学习OpenGL,我的程序有问题,我应该制作太阳能系统.
首先,这是我用来设置ModelView Matrix的代码:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(20, 1, 0, 0);
glTranslatef(0, -20, -60);
Run Code Online (Sandbox Code Playgroud)
然后我使用线环绘制轨道,太阳是gluSphere:
glPushMatrix();
glColor3f(1, 0.4f, 0);
glTranslatef(0, -2, 0);
gluSphere(gluNewQuadric(), 4, 30, 30);
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
这是结果:
但是,当我使用此代码"放大"时:
if (key=='w')
{
glTranslatef(0, 1, 2.4);
}
else if (key=='s')
{
glTranslatef(0, -1, -2.4);
}
Run Code Online (Sandbox Code Playgroud)
有时候是这样的:
线条留在球体前方.我知道这可能是我正在做的事情,但我刚刚开始学习,这真的让我感到沮丧..谢谢!
所以我最近选择了图形编程,我想计算一个立方Bézier曲线.我在二次Bézier上找到了这个优秀的答案,但我不知道如何将其转换为立方Bézier曲线.
我试图在OpenGL中加载VAO,但在运行时它不会绘制.当我将函数中的代码直接用于我的主循环时它运行正常,但每当我尝试通过我的函数加载VAO时它都不起作用.在将值传递给函数时,我已经将其缩小到出错的地方,因为当我直接使用float数组时,它确实有效.我在我的main函数中定义了一个静态float数组的值,我正在加载它:
GLuint RenderLoader::load(float vertices[])
{
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
return VertexArrayID;
}
Run Code Online (Sandbox Code Playgroud)