标签: opengl

Minecraft如何进行照明?

我熟悉的唯一模型是漫射光,但这看起来比这更复杂.

opengl rendering lighting real-time minecraft

24
推荐指数
2
解决办法
6998
查看次数

如何在openGL中使用textureID获取纹理数据

我正在编写一些代码,我可以访问的是一个textureID来访问所需的纹理.有没有办法可以访问这个纹理的RGB值,所以我可以对它进行一些计算?

编辑:我正在寻找倒数glTexSubImage2D.我想获取纹理数据而不是替换它.

opengl textures

24
推荐指数
1
解决办法
2万
查看次数

glLineStipple在OpenGL 3.1中已弃用

glLineStipple已在最新的OpenGL API中弃用.什么被取代?如果没有更换,我怎么能得到类似的效果?(我当然不想使用兼容性配置文件...)

opengl glsl line opengl-3 opengl-4

24
推荐指数
2
解决办法
9454
查看次数

什么是硬件光标,它是如何工作的?

有没有人可以解释硬件光标如何正常工作?它与我在屏幕上绘制的图形有什么关系?我正在使用OpenGL绘制,硬件光标如何与OpenGL图形相关?

编辑:对于那些可能对此感兴趣的人,我刚刚实现了用硬件显示光标所需的内容.实现在内核中并且使用它简单的ioctl就足够了.完美的工作.

opengl graphics cursor hardware-acceleration

24
推荐指数
3
解决办法
3万
查看次数

OpenGL以像素为单位定义顶点位置

我一直在用OpenGL/C++编写一个2D基本游戏引擎,并在我学习的过程中学习一切.我仍然对定义顶点及其"位置"感到困惑.也就是说,我仍然试图理解OpenGL的顶点到像素转换机制.可以简单解释一下,或者有人指出一篇文章或其他可以解释这一点的内容.谢谢!

c++ opengl

24
推荐指数
2
解决办法
2万
查看次数

如何用GLSL改变纹理的色调?

有没有办法使用GLSL(片段着色器)有效地改变2D OpenGL纹理的色调?

有人有一些代码吗?

更新:这是user1118321建议的代码:

uniform sampler2DRect texture;
const mat3 rgb2yiq = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);
const mat3 yiq2rgb = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.1070, 1.7046);
uniform float hue;

void main() {

vec3 yColor = rgb2yiq * texture2DRect(texture, gl_TexCoord[0].st).rgb; 

float originalHue = atan(yColor.b, yColor.g);
float finalHue = originalHue + hue;

float chroma = sqrt(yColor.b*yColor.b+yColor.g*yColor.g);

vec3 yFinalColor = vec3(yColor.r, chroma * cos(finalHue), chroma * sin(finalHue));
gl_FragColor    = vec4(yiq2rgb*yFinalColor, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

这是与参考相比的结果:

在此输入图像描述

我试图在里面用Q切换I,但即使在0°左右,结果也是错误的

你有什么提示吗? …

opengl glsl filter hsv hue

24
推荐指数
1
解决办法
1万
查看次数

OpenGL和OOP程序结构

我已经使用OpenGL和C++开展了各种各样的演示项目,但他们都只是简单地渲染一个具有一些有趣效果的立方体(或类似的简单网格).对于像这样的简单场景,立方体的顶点数据可以存储在不优雅的全局数组中.我现在正在研究使用不同类型的多个对象渲染更复杂的场景.

我觉得很有道理,为不同类型的对象(不同类别Rock,Tree,Character,等),但我不知道如何干净地打破了数据和场景中的对象渲染功能.每个类都将存储自己的顶点位置数组,纹理坐标,法线等.但是我不确定在哪里放置OpenGL调用.我想我将有一个循环(在一个WorldScene类中)迭代场景中的所有对象并呈现它们.

渲染它们是否涉及在每个对象中调用一个render方法,(Rock::render(), Tree::render(),...)还是一个以对象作为参数的渲染方法(render(Rock), render(Tree),...)?后者看起来更干净,因为我不会在每个类中都有重复的代码(虽然可以通过从单个RenderableObject类继承来减轻),并且如果我想稍后移植到DirectX,它允许轻松替换render()方法.另一方面,我不确定我是否可以将它们分开,因为我可能还需要存储在对象中的OpenGL特定类型(例如顶点缓冲区).此外,将渲染功能与对象分开似乎有点麻烦,因为它必须调用许多Get()方法来从对象获取数据.最后,我不确定这个系统如何处理必须以不同方式绘制的对象(不同的着色器,传递给着色器的不同变量等).

这些设计中的一个明显优于其他设计吗?在哪些方面我可以改进它们以保持我的代码组织良好和高效?

c++ architecture opengl oop game-engine

24
推荐指数
1
解决办法
9154
查看次数

为什么我的翻译矩阵需要转置?

我正在使用OpenGL开发一个小型图形引擎,我的翻译矩阵存在一些问题.我正在使用OpenGL 3.3,GLSL和C++.情况是这样的:我已经定义了一个我想在屏幕上呈现的小立方体.立方体使用它自己的坐标系,所以我创建了一个模型矩阵来转换立方体.为了让自己更容易一点,我开始只使用一个平移矩阵作为立方体的模型矩阵,经过一些编码后,我设法使一切正常,立方体出现在屏幕上.没有什么特别的,但我的翻译矩阵有一点我发现有点奇怪.

据我所知,翻译矩阵的定义如下:

1, 0, 0, x
0, 1, 0, y
0, 0, 1, z
0, 0, 0, 1
Run Code Online (Sandbox Code Playgroud)

但是,这对我不起作用.当我以这种方式定义翻译矩阵时,屏幕上不会显示任何内容.它只在我定义我的翻译矩阵时才有效:

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
Run Code Online (Sandbox Code Playgroud)

现在我已经多次查看我的代码了解为什么会出现这种情况,但我似乎无法找出原因,或者我只是错了,是否需要像上面的转置矩阵那样定义转换矩阵?

我的矩阵定义为从左到右,从上到下的一维数组.

以下是我的一些代码可能会有所帮助:

//this is called just before cube is being rendered
void DisplayObject::updateMatrices()
{
    modelMatrix = identityMatrix();
    modelMatrix = modelMatrix * translateMatrix( xPos, yPos, zPos );

    /* update modelview-projection matrix */
    mvpMatrix = modelMatrix * (*projMatrix);
}

//this creates my translation matrix which …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl matrix linear-algebra

24
推荐指数
1
解决办法
1万
查看次数

GLEW做了什么以及为什么需要它?

好的,所以我已经知道为什么我需要GLEW,但只有一点.

如果我使用现代OpenGL的东西,可能是从版本3.0开始,和/或使用核心配置文件,那么GLEW是必需的,因为没有它编译产生的错误,如未glGenVertexArrays声明.

所以GLEW做了一些背景工作,包括我们想要使用的现代OpenGL函数.

除此之外,还有什么其他的吗?另外,它是如何工作的.

举个例子,它是否改进了跨平台编译?(例如,如果从Linux迁移到Windows或OS X,需要对代码进行少量修改?

它是否也改善了图形硬件的"跨平台性"?例如,假设我们有两台相同的计算机,包括操作系统.在一个系统上使用OpenGL 4.3命令编译程序.如果其他系统有只支持OpenGL 3.3的显卡或驱动程序,那么GLEW会帮忙吗?(也许是为旧版OpenGL编译着色器?)

所以你可能会发现我实际上并不知道GLEW做了什么或它是如何做到的.

最后一点; 有谁知道如何使用GLEW与GLFW?我可能会将其作为一个单独的问题发布.

opengl glew opengl-3 opengl-4

24
推荐指数
2
解决办法
1万
查看次数

在没有硬件加速的情况下在Windows上部署Qt5

Qt5可以使用ANGL来使用OpenGL驱动程序或DirectX驱动程序.由于我们不能依赖已安装的OpenGL驱动程序,因此我们需要使用ANGLE后端.遗憾的是,这并不能解决所有部署问题,特别是在没有硬件加速的Windows虚拟机上.在这些系统上,我们收到一条错误消息,指出OpenGL上下文的创建失败了.

屏幕截图:无法为格式QSurfaceFormat创建OpenGL上下文

我们正在部署所有必需的库(libEGL.dll libGLESv2.dll libeay32.dll msvcp110.dll msvcr110.dll d3dcompiler_46.dll),但我们仍然收到此错误消息.

如何部署需要在没有OpenGL驱动程序的最终用户计算机上运行的QML应用程序以及没有Direct3D加速的(虚拟)计算机上运行的QML应用程序?

Qt wiki上有一个页面提到这个问题,但这对解决它没有多大帮助.

Qt 5.4.0的更新:

到目前为止我的发现是:

  • 设置QT_ANGLE_PLATFORM = warp - >创建一个没有内容的窗口.
  • 按预期设置QT_ANGLE_PLATFORM = d3d9 - >相同的错误对话框.
  • 按预期设置QT_ANGLE_PLATFORM = d3d11 - >相同的错误对话框.
  • 设置QT_OPENGL =桌面 - >与QT_ANGLE_PLATFORM = warp相同.
  • 按预期设置QT_OPENGL = angle - >相同的错误对话框.
  • 设置QT_OPENGL =软件+ opengl32sw.dll(Windows的mesa) - >不可预测:可能运行,可能会崩溃,可能会显示错误对话框.

Qt Quick 2D渲染器的更新

虽然,Mesa似乎是一个部分解决方案,但在Qt 5.4.0中,配置似乎经常崩溃.

另一个后退可能是Qt Quick 2D渲染器,但不幸的是,这也会崩溃.

  • 将softwarecontext.dll复制到/ scenegraph +设置QMLSCENE_DEVICE = softwarecontext - > crash

一些用户体验后更新:

角度
  • 在某些系统上有一些渲染错误
  • 在所有系统上都不可靠
与翘曲的角度
  • 不可靠的
桌面OpenGL
  • 默认实现OpenGL 1.1,这太旧了.
  • 即使OpenGL版本没问题,也不可靠.
  • 如果Qt使用,则有渲染错误
QtQuick2dRenderer
  • 有一些重大的渲染问题
  • 崩溃,冻结
  • 适用于没有硬件加速的系统
Mesa OpenGL后端 …

windows opengl deployment qt qt5

24
推荐指数
2
解决办法
1万
查看次数