首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓vulkan读取.spv问题

安卓vulkan读取.spv问题
EN

Stack Overflow用户
提问于 2021-05-08 16:34:41
回答 2查看 161关注 0票数 0

我按照https://developer.android.com/ndk/guides/graphics/shader-compilers?hl=zh-cn ->AOT编译->使用Android Studio中的说明操作。

代码语言:javascript
复制
AAsset* file = AAssetManager_open(assetManager,
                     "shaders/tri.vert.spv", AASSET_MODE_BUFFER);
size_t fileLength = AAsset_getLength(file);
char* fileContent = new char[fileLength];
AAsset_read(file, fileContent, fileLength);

这是我的vert文件和frag文件,它们是从https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Shader_modules复制的。我将这两个文件放在src/main/shaders中

代码语言:javascript
复制
#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) out vec3 fragColor;

vec2 positions[3] = vec2[](
vec2(0.0, -0.5),
vec2(0.5, 0.5),
vec2(-0.5, 0.5)
);

vec3 colors[3] = vec3[](
vec3(1.0, 0.0, 0.0),
vec3(0.0, 1.0, 0.0),
vec3(0.0, 0.0, 1.0)
);

void main() {
    gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
    fragColor = colors[gl_VertexIndex];
}


#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) in vec3 fragColor;

layout(location = 0) out vec4 outColor;

void main() {
    outColor = vec4(fragColor, 1.0);
}

但我从验证中得到了一条消息:

UNASSIGNED-CoreValidation-Shader-InconsistentSpirv(ERROR / SPEC):msgNum: 0- SPIR-V模块无效: SPIR-V标头无效。对象:1 0,类型: 0,名称:空

有人能帮我读一下.spv吗?谢谢!

更新:

代码语言:javascript
复制
    void createGraphicsPipeline(){
            LOGD("Vulkan createGraphicsPipeline");
    
            auto vertShaderCode = readFile("shaders/shader.frag.spv");
            auto fragShaderCode = readFile("shaders/shader.frag.spv");
            VkShaderModule vertShaderModule = createShaderModule(vertShaderCode);
            VkShaderModule fragShaderModule = createShaderModule(fragShaderCode);
           
            VkPipelineShaderStageCreateInfo vertShaderStageInfo{};
            vertShaderStageInfo.sType = 
            VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
            vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;
            vertShaderStageInfo.module = vertShaderModule;
            vertShaderStageInfo.pName = "main";

            VkPipelineShaderStageCreateInfo fragShaderStageInfo{};
            fragShaderStageInfo.sType = 
            VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
            fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT;
            fragShaderStageInfo.module = fragShaderModule;
            fragShaderStageInfo.pName = "main";




std::vector<char> readFile(const char* filename){
        if (mAssetManager == NULL) {
            LOGD("Vulkan mAssetManager is null");
        }
        AAsset *asset = AAssetManager_open(mAssetManager, filename,
                AASSET_MODE_BUFFER);
        if (NULL == asset) {
            LOGD("Vulkan shader is null");
            throw std::runtime_error("Vulkan shader is null");
        }

        long size = AAsset_getLength(asset);
        char* fileContent = new char[size];
        AAsset_read(asset, fileContent, size);

        std::vector<char> buffer;
        buffer.insert(buffer.end(), fileContent, fileContent + strlen(fileContent));

        AAsset_close(asset);
        return buffer;
    }

VkShaderModule createShaderModule(const std::vector<char>& code){

        VkShaderModuleCreateInfo createInfo{};
        createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
        createInfo.codeSize = code.size();
        createInfo.pCode = reinterpret_cast<const uint32_t *>(code.data());
        VkShaderModule shaderModule;
        if (vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) {
            LOGD("failed to create shader module!");
            throw std::runtime_error("failed to create shader module!");
        }
        return shaderModule;
    }

更新:更改为"fileContent + size“后出现错误

2021-05-10 16:59:36.310 8124-8124/com.example.vtest2 I/VALIDATION: VUID-VkPipelineShaderStageCreateInfo-pName-00707(ERROR / SPEC):msgNum: 0-未找到stage VK_SHADER_STAGE_VERTEX_BIT的名为main的入口点。Vulkan规范规定: pName必须是执行模型与阶段(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pName-00707)对象匹配的模块中的OpEntryPoint的名称:1 0,类型: 0,名称: NULL

2021-05-10 16:59:36.310 8124-8124/com.example.vtest2 I/VALIDATION: UNASSIGNED-CoreValidation-Shader-InputNotProduced(ERROR / SPEC):msgNum: 0-片段着色器使用未由顶点着色器对象写入的输入位置0.0 :10xd,类型: 15,名称: NULL

EN

回答 2

Stack Overflow用户

发布于 2021-05-11 03:50:55

您正在为片段和顶点阶段加载片段着色器:

代码语言:javascript
复制
auto vertShaderCode = readFile("shaders/shader.frag.spv");
auto fragShaderCode = readFile("shaders/shader.frag.spv");

第一行可能应该是:

代码语言:javascript
复制
auto vertShaderCode = readFile("shaders/shader.vert.spv");

如果仔细阅读验证错误,它会告诉您片段着色器已成功加载,因此加载着色器的代码没有问题。但第一条消息提示了在顶点阶段加载错误着色器的问题,如上所述。

票数 1
EN

Stack Overflow用户

发布于 2021-05-08 22:13:06

fileContent + strlen(fileContent)这一点看起来很可疑。如果fileContent是SPIR-V,那么它就是u32s的列表。使用strlen,您假设它是一个c字符串(可能是您的文件过去包含源代码而不是编译后的SPIR-V时的残留物)。

尝试将其更改为fileContent + size

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67445562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档