我正在尝试更新我以前使用OpenGL 2.x样式顶点数组的引擎来使用OpenGL 3.x,这意味着更新到VAO/VBO.我想我并没有正确地约束VBO.阅读下面的更多信息或跳到代码,找到我做错了什么.
我的网格类的快速概述看起来像这样:
啮合
MeshNode
MeshObject
如果我绘制一个只有一个MeshObject的MeshNode,它似乎画得很好.当我绘制一个具有多个MeshObjects的MeshNode时,我得到的东西就是我想要绘制的模型的一般形状,但有点乱码.
我已经通过gDEbugger检查了Visual Studio调试器中的顶点数据和VBO数据,它看起来都很好,所以我非常确定从文件加载到VBO中的加载工作正常.
我使用gDEbugger强制它为所有顶点而不是三角形绘制点,并且它具有单个MeshObject的形状,这使我相信我只是没有正确地绑定到不同的VBO.好像它试图用不同的索引绘制,但每次都是相同的顶点.
VertexData如下所示:
struct VertexData
{
enum
{
NUM_TEXCOORDS = 1,
};
vector3 vertex;
vector3 normal;
vector2 texCoord[NUM_TEXCOORDS];
};
Run Code Online (Sandbox Code Playgroud)
相关的MeshNode代码:
void MeshNode::initVAO(void)
{
closeVAO();
unsigned int scan;
//init index data
if (m_meshObjects.size() > 0)
{
glGenVertexArrays(1, &m_meshVAO);
glBindVertexArray(m_meshVAO);
{
//add up the total index count for all the mesh objects in this node
unsigned int indexCount = 0;
for (scan = …Run Code Online (Sandbox Code Playgroud) 我目前正在研究使用OpenGL进行渲染的游戏/引擎,最近已经开始逐步取消对固定功能管道的支持.我可以定位2.1,但是我想使用曲面细分或几何着色器以及2.1中不存在的各种新的GLSL功能.
考虑到游戏将不准备至少再发布一年,将3.2作为最低基数是否合理?
请注意,这个游戏确实利用了更新的功能,如用于延迟照明的MRT帧缓冲器等,我根本不打算支持固定功能硬件.所以它是2.1或3.2,我倾向于3.2.有没有人知道有多少人有3.2兼容卡以及他们被采用的速度这个非常粗略的数字?
我知道glVertexAttribDivisor可以用来修改通用顶点属性在实例渲染过程中前进的速率,但我想知道是否有任何方法可以在没有实例化的情况下以特定速率推进属性.
这是我的意思的一个例子:
假设您正在定义构成一系列线的顶点位置列表,并且您希望将每条线与一个ID相关联.因此,您创建两个vbos,每个vbos包含与其中一个属性相关的数据(所有顶点位置或所有顶点ID).传统上,这意味着每个vbo必须是行数X 2的大小(在元素中)(因为每个点包含两行).这当然意味着我为一行中的每个点复制相同的ID值.
我想要做的是指定ID为顶点位置缓冲区前进的每2个元素提前1个元素.我知道这要求我的顶点位置缓冲区首先被声明(所以我可以引用它来告诉OpenGL多长时间推进ID缓冲区),但它似乎仍然可能.但是,我在OpenGL规范中找不到允许这种操作的任何功能.
我们使用缓冲区对象来减少来自CPU-GPU的复制操作,对于纹理缓冲区对象,我们可以将目标从顶点更改为缓冲区对象中的纹理.这里有纹理缓冲对象的其他优点吗?另外,它不允许过滤,这有什么不利之处吗?
我正在使用仅用于大学的核心OpenGL 3.3编写Wolfenstein 3D的克隆,我遇到了精灵的一些问题,即让它们根据距离正确缩放.
据我所知,以前版本的OGL实际上会为你做这件事,但是这个功能已被删除,而我所有重新实现它的尝试都导致完全失败.
我目前的实施方式是可以在距离上通过,在中距离时不是太破旧,而在近距离时也是如此.
主要问题(我认为)是我对我正在使用的数学没有理解.
精灵的目标大小略大于视口,因此当你接近它时它应该"走出画面",但事实并非如此.它变小了,这让我很困惑.
我录制了一个小视频,以防单词不够.(我在右边)

谁能指引我到我错的地方,并解释原因?
代码:
C++
// setup
glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);
glEnable(GL_PROGRAM_POINT_SIZE);
// Drawing
glUseProgram(StaticsProg);
glBindVertexArray(statixVAO);
glUniformMatrix4fv(uStatixMVP, 1, GL_FALSE, glm::value_ptr(MVP));
glDrawArrays(GL_POINTS, 0, iNumSprites);
Run Code Online (Sandbox Code Playgroud)
顶点着色器
#version 330 core
layout(location = 0) in vec2 pos;
layout(location = 1) in int spriteNum_;
flat out int spriteNum;
uniform mat4 MVP;
const float constAtten = 0.9;
const float linearAtten = 0.6;
const float quadAtten = 0.001;
void main() {
spriteNum = spriteNum_;
gl_Position = MVP * vec4(pos.x + 1, pos.y, 0.5, …Run Code Online (Sandbox Code Playgroud) 可以说我有2种,如人类和小马.它们具有不同的骨骼系统,因此每个物种的均匀骨骼阵列必须不同.我是否必须实现两个单独的着色器程序才能正确渲染每个骨骼数组,或者是否有办法动态声明统一数组并迭代通过该动态数组?
记住性能(所有的着色器都在决策分支上徘徊).
我正在尝试新的SDL2测试版和OpenGL3上下文,我遇到了一个奇怪的问题:
如果我在main()函数中运行SDL初始化代码,它工作正常,但我想在separete init_sdl()函数中使用此代码.
如果我将初始化代码放在单独的init_sdl()函数中,并从main()调用此函数,则从不绘制背景颜色,程序开始疯狂地消耗我所有系统的资源.
有人能指出我在一个单独的函数中初始化SDL的工作示例吗?我似乎无法找到一个......也许这是不可能的?我想我依旧记得在SDL 1.2中遇到了类似的问题,但是自从我使用它以来已经有几年了,而且我认为我没有找到解决方案.事实上,这可能是我选择转而使用SFML的原因.
我真的想使用SDL2代替SFML,因为它运行在更多平台上,但是无法将内容分成小功能对我来说是一个交易破坏者.这应该很容易,我错过了一些明显的东西吗?
编辑:
这有效:
#include <iostream>
#include <GL/glew.h>
#include <SDL.h>
#define PROGRAM_NAME "SDL2 OpenGL3 Example"
int main(int argc, char** argv)
{
SDL_Window* sdl2_window = 0;
SDL_GLContext opengl3_context;
SDL_Init(SDL_INIT_VIDEO);
// set the opengl context version
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
// turn on double buffering set the depth buffer to 24 bits
// you may need to change this to 16 or 32 for your system
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
// create the sdl2 window
sdl2_window = …Run Code Online (Sandbox Code Playgroud) 我正在使用FBO + RBO,而不是默认帧缓冲区上的常规双缓冲,我正在绘制RBO,然后在单个缓冲的OpenGL上下文中直接在默认FBO(0)的GL_FRONT缓冲区上进行blit.
这很好,我没有任何闪烁,但如果场景有点复杂,我经历了巨大的fps下降,有些奇怪,我知道一些事情是错的.而且我不是指从1/60到1/30因为跳过同步,我的意思是突然下降了90%fps.
在blit之后我尝试了一个glFlush() - 没有区别,然后我在blit之后尝试了glFinish(),并且我有10x fps的提升.
所以我在默认的framebuffer和swapbuffers()上使用了常规的doble缓冲,并且fps也得到了提升,就像使用glFinish()时一样.
我无法弄清楚发生了什么.为什么glFinish()在它不应该做的时候会产生很大的不同?并且,可以直接在前缓冲区上使用RBO和blit,而不是在双缓冲上下文中使用swapbuffers调用吗?我知道我缺少vsync但是复合管理器无论如何都会同步(事实上我没有看到任何撕裂),就像监视器缺少10帧中的9帧一样.
出于好奇,本机swapbuffers()在windows或linux上使用glFinish()吗?
在OpenGL 3+的一些OpenGL教程之后,我已经遇到了一些差异,这是我设法得到的代码,但是刚出门,我得到了大量的错误,没有其中说它找不到包含的标题,只是标题没有定义核心功能.
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/glfw3.h>
#include <glm/glm.hpp>
int main(){
// Initialise GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
return -1;
}
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); // 4x antialiasing
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //I don't want the
//old OpenGL
// Open a window and create its OpenGL context
if( !glfwOpenWindow( 1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW ) )
{
fprintf( stderr, "Failed to open GLFW window\n" );
glfwTerminate();
return -1;
}
// …Run Code Online (Sandbox Code Playgroud) 我已经为现代OpenGL版本重新实现了OpenCSG.
PixelFormatAttributes:
NSOpenGLPFAColorSize , 24 ,
NSOpenGLPFAAlphaSize , 8 ,
NSOpenGLPFADepthSize , 32 ,
NSOpenGLPFAStencilSize , 8 ,
NSOpenGLPFAAccelerated ,
NSOpenGLPFADoubleBuffer ,
NSOpenGLPFASupersample ,
NSOpenGLPFASampleBuffers, 1 ,
NSOpenGLPFASamples , 4 ,
Run Code Online (Sandbox Code Playgroud)
FBO规格:( 尝试使用多重采样渲染到FBO,但线条越来越强大且可见,请查看底部的屏幕截图)
- 创建功率为2的纹理,GL_RGBA(尝试过GL_RGBA8和GL_RGBA32F)
- GL_DEPTH24_STENCIL8(尝试过GL_DEPTH32_STENCIL8,没有结果)
简单算法Goldfeather:
while (i < depth complexity) {
take channel for render
merge layers if no free channel
render each layer with stencil func, mask and depth params to channel (FBO)
}
merge layers (taking texture from FBO and render objects again …Run Code Online (Sandbox Code Playgroud)