在iOS上链接OpenGL es shader 3.0程序时,我感到很沮丧.
我有一个顶点着色器和一个片段着色器,它们被链接以生成一个程序.两个着色器中都有共享的制服和统一块.我知道这些制服必须具有完全相同的类型,精度和名称,因此我甚至可以将统一声明从一个着色器复制到另一个着色器.
这是我的顶点着色器的代码:
// Vertex shader
#version 300 es
precision highp float;
// ...........................
// Shared uniforms ...
uniform mat4 viewMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 texcoordMatrix;
uniform mat4 projMatrix;
uniform bool shadingEnabled;
uniform bool fogEnabled;
uniform bool flatShading;
uniform bool specularEnabled;
uniform bool generateReflectionTexCoord;
uniform float zBias;
layout (std140) uniform cbFog
{
int g_fogMode;
float g_fogStart;
float g_fogEnd;
float g_fogDensity;
vec4 g_fogColor;
};
layout (std140) uniform cbMaterial
{
vec4 mtlAmbient;
vec4 mtlDiffuse;
vec4 mtlSpecular; …Run Code Online (Sandbox Code Playgroud) 我有一个用C ++ 98编写的大型C ++库,该库大量使用C ++接口(准确地说,只有纯虚函数的C ++类)进行事件处理。现在看到我的代码是由C ++ 11/14编译器编译的,我在考虑是否可以通过使用C ++ 11 lambda代替接口实现来减少样板代码。
在我的库中,有些C ++接口只有一个方法,例如,以下用于定义简单任务的接口:
class SimpleTask
{
public:
void run();
};
Run Code Online (Sandbox Code Playgroud)
我的意图是使用C ++ lambda替换旧的单方法接口实现代码,如下所示:
void myFunction()
{
...
class MySimpleTask : SimpleTask //An inline class to implement the iterface
{
public:
void run()
{
//Do somthing for this task
...
delete this; //Finally, destroy the instance
}
};
MySimpleTask * myThreadTask = new MySimpleTask();
Thread myThread(L"MyTestingThread", myThreadTask);
myThread.start();
...
}
Run Code Online (Sandbox Code Playgroud)
在Java 8中,我们可以使用Java lambda来实现单方法接口,以比使用匿名类更简洁地编写代码。我在C ++ 11中做了一些研究,发现没有类似的东西。
由于我的库的事件处理代码是按面向对象的模式设计的,而不是按功能编码的样式设计的,是否有办法使用lambda来帮助减少那些单方法接口实现代码?
我是 Visual Studio Code 的新手,并尝试编写tasks.json来执行我的自定义构建任务,以便我可以通过“终端/运行构建任务...”来构建我的项目。
但是,我的构建任务由多个命令组成,例如(例如 Windows 脚本):
preBuildTask1.bat
preBuildTask2.bat
...
build.bat
...
postBuildTask1.bat
postBuildTask2.bat
...
Run Code Online (Sandbox Code Playgroud)
我看起来 task.json 只允许我为“ command ”属性放置一个命令,例如:
"tasks": [
{
"label": "emcc",
"type": "shell",
"command": "buildTask.ps1",
"group": {
"kind": "build",
"isDefault": true
}
},
]
}
Run Code Online (Sandbox Code Playgroud)
我当前的工作是将所有子任务放入 powershell 脚本中,然后在tasks.json 中调用该脚本,如上面代码中所示的“ buildTask.ps1 ”。如果我可以直接为单个命令属性编写多个任务,那就更方便了。有人知道该怎么做吗?谢谢。
从我所看到的 Visual Studio 提供的所有 DirectX 11 模板项目中,示例代码在为模型-视图-投影变换矩阵创建常量缓冲区时使用“D3D11_USAGE_DEFAULT”使用标志。然而,从msdn guildline(选择资源(Direct3D 10))中,它清楚地表明,如果需要在每帧基础上更新缓冲区(这是更新每帧的变换矩阵的情况),那么我们应该使用 D3D11_USAGE_DYNAMIC 可以获得更好的 CPU 访问,从而获得更好的性能。有人可以建议我模板项目是否不关心性能或者我对指南有错误的理解吗?
我正在尝试将我的 OpenGL 3D 游戏引擎移植到 Vulkan。游戏场景中有大量的 3D 对象,每个对象都有自己的属性(模型矩阵、灯光等),并且对象是完全动态的,这意味着在游戏过程中可能会有一些 3D 对象进入,而另一些可能会被移除. 使用 OpenGL,我将 3D 对象的属性分组到着色器中的统一缓冲区中(代码简化):
layout(std140, set = 0, binding = 0) uniform object_attrib
{
vec3 light_pos;
vec3 light_color;
mat4 model;
mat4 view_projection;
...
} params;
Run Code Online (Sandbox Code Playgroud)
我现在要做的是为游戏场景中的每个 3D 对象使用这个单一的统一缓冲区,以通过 Vulkan 渲染它们。
我正在使用单个 Vulkan 渲染通道,在开始渲染通道和结束渲染通道中,我使用 for-each 循环遍历每个 3D 对象并执行以下操作来渲染它们。请参阅下面的伪代码。
vkBeginCommandBuffer(cmdBuffer, ...);
vkCmdBeginRenderPass(cmdBuffer, ...);
for(object3D obj : scene->objects)
{
// Step 1 - update object's uniform data by memcpy()
_updateUniformBuffer(obj);
// Step 2 - build draw command for this object
// bind vertex buffer, …Run Code Online (Sandbox Code Playgroud) 这似乎是一个简单的Vulkan API问题,但我真的找不到搜索互联网后的答案.我注意到有一个Vulkan功能:
void vkCmdUpdateBuffer(
VkCommandBuffer commandBuffer,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dataSize,
const void* pData);
Run Code Online (Sandbox Code Playgroud)
乍一看,我认为它可用于记录命令缓冲区,因为它vkCmd的名称中有前缀,但文档说明了这一点
vkCmdUpdateBuffer仅允许在渲染过程之外.出于同步障碍的目的,此命令被视为"传输"操作.
所以我开始认为它是一个便利函数,它包含缓冲区数据传输操作,就像memcpy()用来将数据从主机复制到设备一样.
然后我的问题是:为什么没有一个Vulkan样本/教程(我已经搜索了所有这些)vkCmdUpdateBuffer()而不是手动处理数据memcpy().我明白了吗?
当我将 Android Studio 项目与 build.gradle 同步时,我尝试打印出一个变量(例如:${project.projectDir}),因为我需要查看该变量的值以使我的任务定义正常工作。
我搜索了堆栈溢出,然后按照其他人的建议,我尝试了以下方法:
project.logger.debug("@@@@@@@@@ ${project.projectDir}")
System.out.println("@@@@@@@@@ ${project.projectDir}")
println "@@@@@@@@@ ${project.projectDir}"
Run Code Online (Sandbox Code Playgroud)
但以上均不起作用,底部的“同步”窗格不显示任何内容。由于Android studio不提供“调试gradle”功能。那么了解 build.gradle 中定义/预定义的变量值的简单方法是什么?
我有一个包含大量资源的 Android 教育应用程序,因此我使用 Android 捆绑包 (.aab) 并将资源的主要部分(书籍数据)放入资源包中。这是我按照Android PLAY Asset Delivery制作的 build.gradle 文件。
apply plugin: 'com.android.asset-pack'
assetPack {
packName = "BookAssets"
dynamicDelivery {
deliveryType = "on-demand"
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,除了我必须使用硬编码路径src/main/assest来托管我的资产包数据。由于该项目是跨平台的,我希望将图书数据托管在所有平台(iOS、Android、Windows、Mac)的中心位置。
对于 Android 基础 APK,我们可以轻松地在 build.gradle 中设置自定义资源路径:sourcesets.main.assets.srcDirs,但是当我尝试在资产包模块上使用它时,Android资产包插件报告错误并抱怨它找不到定义assets.srcDirs。
那么有没有办法为 Android Assets Pack 模块设置自定义资源位置呢?
更新
我当前的工作是在src/main/assets文件夹下创建一个硬符号链接,让 gradle 找到托管在其他位置的资产。它有效,但我仍然想知道是否有官方方法可以在 gradle 中为 Asset Pack 自定义资源位置。