我想将一个值列表发送到片段着色器.它是一个可能很大(几千个项目长)的单精度浮标列表.片段着色器需要随机访问此列表,我想在每个帧上刷新CPU的值.
我正在考虑如何做到这一点:
作为数组类型的统一变量("uniform float x [10];").但是这里似乎有限制,在我的GPU上发送超过几百个值非常慢,而且当我宁愿在运行时更改它时,我还必须对着色器中的上限进行硬编码.
作为高度为1且列表宽度的纹理,然后使用glCopyTexSubImage2D刷新数据.
其他方法?我最近没有跟上GL规范中的所有变化,也许还有一些专门为此目的设计的方法?
我正在努力将大型Delphi代码库调整为64位.在许多情况下,有些行指针是从32位值转换为32位值,类似于:
var
p1,p2 : pointer;
begin
inc(Integer(p1),10);
p2 := Pointer(Integer(p1) + 42);
Run Code Online (Sandbox Code Playgroud)
在我可以找到这些演员表的地方,我已经用NativeInt-cast替换它们,而不是在64位模式下使它们正确.
但是我不确定我是否找到了所有这些.有时候演员表更精细,所以只需要对字符串"整数"进行文本搜索,这也是不够的.
由于"整数("转换将在64位失败,如果指针值高于整数类型的范围我有一个想法:如果我可以强制内存管理器分配4gb以上的内存(所以指针值使用更多)比32位)?然后我会得到运行时错误,并且可以更容易地找到错误的演员.这可能吗?或者任何人都可以推荐其他技术?
我已经将C#WinForms应用程序从Visual C#2008(框架3.5)升级到2010(框架4.0),我遇到了运行时错误.
应用程序使用Assembly.Load(filename)在运行时动态加载程序集.它是这样设计的,因为根据用户配置,它应该加载位于不同文件夹中的程序集的不同实现.
一切正常,除非加载的dll有嵌入资源(位图或xsd数据集),然后我得到FileNotFoundException:
{"无法找到文件'FF.Fi_Stat.SKA.resources'.":null}
该程序集称为FF.Fi_Stat.SKA.dll.我不理解这条消息,因为没有外部资源(只有嵌入式资源),并且VS在输出目录中没有生成具有该名称的文件.有任何想法吗?
-
更多细节:
这是我加载程序集的方式:
Assembly a = Assembly.LoadFile(assemblyFileName);
Run Code Online (Sandbox Code Playgroud)
组件的实际加载工作,当我尝试在程序集内创建异常发生的类的实例时:
Type t = a.GetType("nameofclass");
Activator.CreateInstance(t); //fails here
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
Exception has been thrown by the target of an invocation.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
...
Run Code Online (Sandbox Code Playgroud)
内部异常堆栈跟踪:
at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, …Run Code Online (Sandbox Code Playgroud) 我正在使用以下文件从文件加载自定义样式:
TStyleManager.LoadFromFile(filename)
Run Code Online (Sandbox Code Playgroud)
当文件被更改时,我想再次加载它.但是,如果我尝试我得到一个EDuplicateStyleException因为风格已经注册.
有没有办法卸载样式,所以我可以再次加载它?典型的情况是您正在更改自定义样式,并希望在不重新启动整个应用程序的情况下查看它.
如何在dll中嵌入Delphi XE2 VCL-Styles?在DLL项目的项目设置中看不到"应用程序 - 外观"页面.
我尝试在一个包含在$ R指令中的rc文件中定义它们,但是如果有更好的方法我想知道它.
RC文件示例:
GOLDENGRAPHITE VCLSTYLE "C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\Redist\styles\vcl\GoldenGraphite.vsf"
CARBON VCLSTYLE "C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\Redist\styles\vcl\Carbon.vsf"
Run Code Online (Sandbox Code Playgroud)
特别是必须指定XE2安装文件夹的完整路径是我想要避免的.
我在某些ATI卡(Radeon X1650,X1550 +等)上遇到了一个棘手的问题.
消息是:"模块'atioglxx.dll'中地址6959DD46处的访问冲突'.读取地址00000000"
它出现在这一行:
glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);
Run Code Online (Sandbox Code Playgroud)
注意:
这是我到目前为止尝试过的(在代码中使用断言):
它通过所有那些测试,然后仍然失败的消息.
我觉得我已经尝试了一切,没有更多的想法.我真的希望这里的GL-guru可以提供帮助!
编辑:
结束后它可能是我在这里发布的驱动程序错误:http://www.opengl.org/discussion_boards/ubbthreads.php? subb = showflat&Number = 295137# Post295137
我也尝试了GL_PACK_ALIGNMENT,它没有帮助.
通过一些更多的调查,我发现它只发生在我之前使用glCopyTexSubImage2D调用像素填充的纹理上.所以我可以通过调用glReadPixels然后调用glTexImage2D来替换glCopyTexSubImage2d调用来产生一种解决方法.
这是我更新的代码:
{
glCopyTexSubImage2D cannot be used here because the combination of calling
glCopyTexSubImage2D and then later glGetTexImage on the same texture causes
a crash in atioglxx.dll on ATI Radeon X1650 and X1550.
Instead we copy to the main memory first and then update.
}
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, …Run Code Online (Sandbox Code Playgroud) 我注意到,当启用VCL-Styles时,即使没有按下Alt键,也会使用热键选择菜单中的项目.
这会干扰我的其他用户界面,我发现样式库改变了热键的行为很奇怪.
我可以以某种方式消除这种不一致吗?
正常:按"A"不会激活主菜单(Alt + A会激活).

样式:按"A"激活主菜单.注意:没有Alt键.

我的测试项目在这里,以防任何人想要尝试它.
我知道不建议混合使用OpenGL和DirectX,但我正在尝试在使用单独图形API的两个不同应用程序之间建立桥梁:我希望有一种共享数据的技术,特别是纹理.
我有一个在Direct3D中创建的纹理,如下所示:
d3_device-> CreateTexture(width, height,
1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,
&texture, NULL);
Run Code Online (Sandbox Code Playgroud)
有没有什么办法可以在不通过系统内存往返的情况下使用OpenGL的这种纹理?
我试图通过电子邮件发送一个用Delphi构建的DLL文件,但收到了拒绝电子邮件报告:
"您的电子邮件被拒绝,因为它包含Trojan.Delf-9364"
所以我将文件上传到http://scanner.novirusthanks.org,并且确定它在其中一个病毒扫描程序中报告了一个正面:
"F-PROT6 20100630 4.5.1.85 W32/Swizzor-based.2!Maximus"
然后我构建了一个空的exe文件(文件 - 新的 - VCL表单应用程序)并再次上传,这次我得到了另一个积极的:
"VBA32 01/07/2010 3.12.12.2 Trojan.Win32.Swisyn.acyl"
更多细节在这里:http://scanner.novirusthanks.org/analysis/e59033c40f1a6e37c210cb1c4f40f059/UHJvamVjdDEuZXhl/
所以我不确定如何解释这些结果.以上是误报,我的计算机是否感染了感染所有二进制文件的病毒,或者我的Delphi副本是否感染了特定于Delphi的病毒?我使用AVG防病毒软件,它在我的计算机上报告没有问题.也许Delphi 2010的其他人可以尝试上传project1.exe并查看它们是否收到不同的结果?
delphi ×5
delphi-xe2 ×4
opengl ×3
vcl-styles ×3
64-bit ×1
antivirus ×1
c# ×1
delphi-2010 ×1
direct3d ×1
glsl ×1
textures ×1