我熟悉的唯一模型是漫射光,但这看起来比这更复杂.
我正在编写一些代码,我可以访问的是一个textureID来访问所需的纹理.有没有办法可以访问这个纹理的RGB值,所以我可以对它进行一些计算?
编辑:我正在寻找倒数glTexSubImage2D.我想获取纹理数据而不是替换它.
glLineStipple已在最新的OpenGL API中弃用.什么被取代?如果没有更换,我怎么能得到类似的效果?(我当然不想使用兼容性配置文件...)
有没有人可以解释硬件光标如何正常工作?它与我在屏幕上绘制的图形有什么关系?我正在使用OpenGL绘制,硬件光标如何与OpenGL图形相关?
编辑:对于那些可能对此感兴趣的人,我刚刚实现了用硬件显示光标所需的内容.实现在内核中并且使用它简单的ioctl就足够了.完美的工作.
我一直在用OpenGL/C++编写一个2D基本游戏引擎,并在我学习的过程中学习一切.我仍然对定义顶点及其"位置"感到困惑.也就是说,我仍然试图理解OpenGL的顶点到像素转换机制.可以简单解释一下,或者有人指出一篇文章或其他可以解释这一点的内容.谢谢!
有没有办法使用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和C++开展了各种各样的演示项目,但他们都只是简单地渲染一个具有一些有趣效果的立方体(或类似的简单网格).对于像这样的简单场景,立方体的顶点数据可以存储在不优雅的全局数组中.我现在正在研究使用不同类型的多个对象渲染更复杂的场景.
我觉得很有道理,为不同类型的对象(不同类别Rock,Tree,Character,等),但我不知道如何干净地打破了数据和场景中的对象渲染功能.每个类都将存储自己的顶点位置数组,纹理坐标,法线等.但是我不确定在哪里放置OpenGL调用.我想我将有一个循环(在一个World或Scene类中)迭代场景中的所有对象并呈现它们.
渲染它们是否涉及在每个对象中调用一个render方法,(Rock::render(), Tree::render(),...)还是一个以对象作为参数的渲染方法(render(Rock), render(Tree),...)?后者看起来更干净,因为我不会在每个类中都有重复的代码(虽然可以通过从单个RenderableObject类继承来减轻),并且如果我想稍后移植到DirectX,它允许轻松替换render()方法.另一方面,我不确定我是否可以将它们分开,因为我可能还需要存储在对象中的OpenGL特定类型(例如顶点缓冲区).此外,将渲染功能与对象分开似乎有点麻烦,因为它必须调用许多Get()方法来从对象获取数据.最后,我不确定这个系统如何处理必须以不同方式绘制的对象(不同的着色器,传递给着色器的不同变量等).
这些设计中的一个明显优于其他设计吗?在哪些方面我可以改进它们以保持我的代码组织良好和高效?
我正在使用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) 好的,所以我已经知道为什么我需要GLEW,但只有一点.
如果我使用现代OpenGL的东西,可能是从版本3.0开始,和/或使用核心配置文件,那么GLEW是必需的,因为没有它编译产生的错误,如未glGenVertexArrays声明.
所以GLEW做了一些背景工作,包括我们想要使用的现代OpenGL函数.
除此之外,还有什么其他的吗?另外,它是如何工作的.
举个例子,它是否改进了跨平台编译?(例如,如果从Linux迁移到Windows或OS X,需要对代码进行少量修改?
它是否也改善了图形硬件的"跨平台性"?例如,假设我们有两台相同的计算机,包括操作系统.在一个系统上使用OpenGL 4.3命令编译程序.如果其他系统有只支持OpenGL 3.3的显卡或驱动程序,那么GLEW会帮忙吗?(也许是为旧版OpenGL编译着色器?)
所以你可能会发现我实际上并不知道GLEW做了什么或它是如何做到的.
最后一点; 有谁知道如何使用GLEW与GLFW?我可能会将其作为一个单独的问题发布.
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上有一个页面提到这个问题,但这对解决它没有多大帮助.
到目前为止我的发现是:
虽然,Mesa似乎是一个部分解决方案,但在Qt 5.4.0中,配置似乎经常崩溃.
另一个后退可能是Qt Quick 2D渲染器,但不幸的是,这也会崩溃.