标签: opengl

简单的openGL程序不会通过编译

我正在尝试在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)

c++ opengl g++ glfw

0
推荐指数
1
解决办法
872
查看次数

GLEW如何运作?

我目前正在Windows上学习OpenGL,有一些我不明白的东西.如果我想调用类似的函数glShaderSource,除非我链接GLEW,否则它是未定义的.但是,一旦我链接GLEW并调用glewInit,glShaderSource就会突然定义并可以使用.使用GLEW显式加载需要哪些函数,以及在初始化GLEW后自动加载哪些函数?

opengl glew

0
推荐指数
1
解决办法
151
查看次数

比较openGL中的两个纹理

我是OpenGL的新手,我很期待比较两种纹理,以了解它们彼此之间的相似程度。我知道如何使用两个位图图像来实现此目的,但我确实需要使用一种方法来比较两个纹理。

问题是:当我们比较两个图像时,有什么方法可以比较两个纹理吗?像一个像素一个像素地比较两个图像?

opengl opengl-es

0
推荐指数
1
解决办法
1047
查看次数

显卡内存和进程的虚拟地址空间

假设我有一个游戏,在openGL方面做了很多图形,我有一个安装了Linux 32位的桌面,配有4GB内存和1G Nvidia显卡.我的游戏应用程序虚拟地址空间如何?显卡内存是否映射在此虚拟地址空间中?

此外,RAM和显卡内存之间是否存在某种关系?linux是否为显卡分配了相同的RAM,任何进程都无法使用?也就是说,它导致我的游戏进程只有3GB的RAM可用?

linux opengl memory-management gpu

0
推荐指数
1
解决办法
716
查看次数

当有多个着色器程序时使用glClear()

假设我想在两个视口中渲染OpenGL场景.第一个视口渲染彩色图像,第二个视口渲染深度图像.每个都有自己的顶点着色器和片段着色器,每个都有自己的着色器程序.着色器类似,唯一的区别是对于彩色图像,顶点着色基于顶点法线在顶点着色器中定义,而对于深度图像,顶点颜色基于顶点深度在片段着色器中定义.要执行渲染,我glUseProgram()是颜色着色器程序,然后绘制颜色场景,然后glUseProgram()绘制深度着色器程序,并绘制深度场景.

我不确定的是,glClear()当有两个着色器程序时,它是如何工作的.我是否需要在每个渲染循环中调用它两次 - 一次在渲染彩色图像之前,一次在渲染深度图像之前?当我只召唤一次它似乎工作,但这对我来说似乎很奇怪.我原以为每个着色器程序一次写入颜色和深度缓冲区.因此,在渲染深度图像时,它会留下渲染彩色图像的缓冲区......但似乎并非如此.有人可以向我解释一下吗?谢谢!

opengl graphics glsl

0
推荐指数
1
解决办法
377
查看次数

带有QT错误的OpenGL:ASSERT:"QOpenGLFunctions :: isInitialized(d_ptr)".无法创建OpenGL上下文

我最近制作了第一个渲染立方体的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)

c++ opengl qt opengl-es

0
推荐指数
1
解决办法
3323
查看次数

如何在OpenGL中扩展模型?

我正在尝试在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)

c++ opengl

0
推荐指数
1
解决办法
5890
查看次数

相机的OpenGL问题(?)

我正在学习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)

这是结果:

SolarSystem1

但是,当我使用此代码"放大"时:

if (key=='w')
{
    glTranslatef(0, 1, 2.4);
}
else if (key=='s')
{
    glTranslatef(0, -1, -2.4);
}
Run Code Online (Sandbox Code Playgroud)

有时候是这样的:

在此输入图像描述

线条留在球体前方.我知道这可能是我正在做的事情,但我刚刚开始学习,这真的让我感到沮丧..谢谢!

c++ opengl glut

0
推荐指数
1
解决办法
50
查看次数

如何将二次贝塞尔曲线代码转换为三次贝塞尔曲线?

所以我最近选择了图形编程,我想计算一个立方Bézier曲线.我在二次Bézier上找到了这个优秀的答案,但我不知道如何将其转换为立方Bézier曲线.

c++ opengl directx bezier curve

0
推荐指数
1
解决办法
3992
查看次数

将float数组传递给函数

我试图在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)

c++ arrays opengl

0
推荐指数
1
解决办法
634
查看次数

标签 统计

opengl ×10

c++ ×6

opengl-es ×2

arrays ×1

bezier ×1

curve ×1

directx ×1

g++ ×1

glew ×1

glfw ×1

glsl ×1

glut ×1

gpu ×1

graphics ×1

linux ×1

memory-management ×1

qt ×1