>source

저는 OpenGL에서 몇 가지 기본 사항을 그리기 위해 C++ 17 및 WebGL 1.0과 함께 emscripten을 사용하고 있습니다. 하지만 셰이더 컴파일을 지나칠 수 없는 것 같습니다. 셰이더가 문제가 될 가능성을 없애기 위해 다양한 유형의 셰이더를 시도했습니다.

내 가정은 이것이 셰이더 텍스트의 인코딩이지만 알아낼 수 없는 것 같습니다. 누군가 이미 이 문제에 직면해 있고 해결책을 제시할 수 있습니다.

컴파일:

-s ENVIRONMENT=web
-s TOTAL_MEMORY=2147483648
-s MODULARIZE=1
-s EXPORT_ES6=1
-s DEMANGLE_SUPPORT=1
-s USE_PTHREADS=0
-s GL_ASSERTIONS=1
-s GL_DEBUG=1
--preload-file ./[email protected]/

최소한의 프로그램을 빌드하려는 경우 파일 이름은자산~이다standard.vert그리고standard.frag

셰이더

정점 셰이더:

precision mediump float;
attribute vec2 vertPosition;
attribute vec3 vertColor;
varying vec3 fragColor;
void main() {
    fragColor= vertColor;
    gl_Position= vec4(vertPosition, 0.0, 1.0);
}

조각 셰이더:

precision mediump float;
varying vec3 fragColor;
void main() {
    gl_FragColor= vec4(fragColor, 1.0);
}

로더

GLenum ErrorCheckValue= glGetError();
GLint  gl_shader_result= GL_FALSE;
int    InfoLogLength;
std::string vertex_src;
std::string frag_src;
FILE*       fp= nullptr;
fp= fopen( "/standard.vert", "r" );
if ( !fp )
{
    emscripten_console_error( "No file found for vertex shader" );
    return;
}
vertex_src= readFile( fp );
emscripten_console_logf( "Vertex Shader:\n%s", vertex_src.c_str() );
fclose( fp );
fp= fopen( "/standard.frag", "r" );
if ( !fp )
{
    emscripten_console_error( "No file found for fragment shader" );
    return;
}
frag_src= readFile( fp );
emscripten_console_logf( "Fragment Shader:\n%s", frag_src.c_str() );
fclose( fp );
const char* vertexCode= vertex_src.c_str();
const char* fragCode= frag_src.c_str();
u32 vertexShaderId= glCreateShader( GL_VERTEX_SHADER );
glShaderSource( vertexShaderId, 1, (const GLchar* const*)vertexCode, NULL );
glCompileShader( vertexShaderId );
//check for vertex shader errors
glGetShaderiv( vertexShaderId, GL_COMPILE_STATUS, &
gl_shader_result );
glGetShaderiv( vertexShaderId, GL_INFO_LOG_LENGTH, &
InfoLogLength );
if ( InfoLogLength > 0 )
{
    std::string msg( InfoLogLength + 1, '\0' );
    glGetShaderInfoLog( vertexShaderId, InfoLogLength, NULL, (GLchar*)msg.c_str() );
    emscripten_console_error( ( "WASM:: Vertex shader error: " + msg ).c_str() );
    return;
}
u32 fragmentShaderId= glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShaderId, 1, (const GLchar* const*)fragCode, NULL );
glCompileShader( fragmentShaderId );
//check for vertex shader errors
glGetShaderiv( fragmentShaderId, GL_COMPILE_STATUS, &
gl_shader_result );
glGetShaderiv( fragmentShaderId, GL_INFO_LOG_LENGTH, &
InfoLogLength );
if ( InfoLogLength > 0 )
{
    std::string msg( InfoLogLength + 1, '\0' );
    glGetShaderInfoLog( fragmentShaderId, InfoLogLength, NULL, (GLchar*)msg.c_str() );
    emscripten_console_error( ( "WASM:: Fragment shader error: " + msg ).c_str() );
    return;
}
u32 shaderProgramId= glCreateProgram();
glAttachShader( shaderProgramId, vertexShaderId );
glAttachShader( shaderProgramId, fragmentShaderId );
glLinkProgram( shaderProgramId );
//Check the program
glGetProgramiv( shaderProgramId, GL_LINK_STATUS, &
gl_shader_result );
glGetProgramiv( shaderProgramId, GL_INFO_LOG_LENGTH, &
InfoLogLength );
if ( InfoLogLength > 0 )
{
    std::string msg( InfoLogLength + 1, '\0' );
    glGetProgramInfoLog( shaderProgramId, InfoLogLength, NULL, (GLchar*)msg.c_str() );
    emscripten_console_error( ( "WASM:: Shader compilation error: " + msg ).c_str() );
    return;
}
emscripten_console_log( "WASM:: Compiled shaders" );
glDetachShader( shaderProgramId, vertexShaderId );
glDetachShader( shaderProgramId, fragmentShaderId );
glDeleteShader( vertexShaderId );
glDeleteShader( fragmentShaderId );

물론 오류:glCompileShader: 오류: 1:1: '': 구문 오류

이 모든 것을 읽어 주셔서 감사합니다. 모든 의견, 제안 또는 솔루션은 항상 더 나은 것이 아니므로 감사합니다.

readFile은 무엇을 합니까? 셰이더 파일에 BOM이 있을 수 있습니까? 각각의 처음 3바이트를 16진수로 인쇄합니다.

Retired Ninja2022-01-03 13:09:10

16진수가 제대로 표시되지 않았습니다. 이 code 줄을 사용하여 인쇄했습니다. emscripten_console_logf( "수직: %.2x, %.2x, %.2x", vertex_src[0], vertex_src[1], vertex_src[2] ); 출력은 70, 72, 65입니다.

Simanto Rahman2022-01-03 13:09:10

70h, 72h, 65h는 '미리'입니다.

Rabbid762022-01-03 13:09:10

이것은 정밀 mediump float의 일부입니다. 맞습니다.

Simanto Rahman2022-01-03 13:09:10
  • 이전 ggplot에 조정된 Bonferroni 값 플로팅
  • 다음 c++ : Node-Gyp가 brain.js를 설치하는 동안 오류를 반환합니다.