{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/gstex-per-primitive-texturing-of-2d-gaussian","title":"GStex: Per-Primitive Texturing of 2D Gaussian Splatting for Decoupled Appearance and Geometry Modeling","arxiv_id":"2409.12954","date":"2024-09-19","proceeding":null,"authors":["Victor Rong","Jingxiang Chen","Sherwin Bahmani","Kiriakos N. Kutulakos","David B. Lindell"],"abstract":"Gaussian splatting has demonstrated excellent performance for view synthesis and scene reconstruction. The representation achieves photorealistic quality by optimizing the position, scale, color, and opacity of thousands to millions of 2D or 3D Gaussian primitives within a scene. However, since each Gaussian primitive encodes both appearance and geometry, these attributes are strongly coupled--thus, high-fidelity appearance modeling requires a large number of Gaussian primitives, even when the scene geometry is simple (e.g., for a textured planar surface). We propose to texture each 2D Gaussian primitive so that even a single Gaussian can be used to capture appearance details. By employing per-primitive texturing, our appearance representation is agnostic to the topology and complexity of the scene's geometry. We show that our approach, GStex, yields improved visual quality over prior work in texturing Gaussian splats. Furthermore, we demonstrate that our decoupling enables improved novel view synthesis performance compared to 2D Gaussian splatting when reducing the number of Gaussian primitives, and that GStex can be used for scene appearance editing and re-texturing.","url_abs":"https://arxiv.org/abs/2409.12954v3","url_pdf":"https://arxiv.org/pdf/2409.12954v3.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"gstex-per-primitive-texturing-of-2d-gaussian","repo_url":"https://github.com/victor-rong/gstex","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"jax","reach":{"status":"ok","spdx":"Apache-2.0"}}],"tasks":[{"task_slug":"novel-view-synthesis","task_name":"Novel View Synthesis"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2409.12954","atlas_url":"https://app.syntology.ai/?focus=2409.12954","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2409.12954"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/victor-rong/gstex","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran_honours":3,"ran":10,"unverified":1},"by_repo_kind":{"official":{"samples":14,"ran":13,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"3d2c1a432b1a3561","entry":"RGB2SH","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/models/gstex.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/models/gstex.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"3d2c1a432b1a3561"}},{"code_sha256_prefix":"508a98451f5b78fe","entry":"SH2RGB","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/models/gstex.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/models/gstex.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"508a98451f5b78fe"}},{"code_sha256_prefix":"f1e7d68796e89ab2","entry":"lossfun_outer","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/model_components/losses.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/model_components/losses.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"f1e7d68796e89ab2"}},{"code_sha256_prefix":"c64c9a3a66a1d0c8","entry":"merge_methods","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/configs/method_configs.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/configs/method_configs.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"c64c9a3a66a1d0c8"}},{"code_sha256_prefix":"de818de3a5e2a784","entry":"outer","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/model_components/losses.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/model_components/losses.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"de818de3a5e2a784"}},{"code_sha256_prefix":"22103dda822713ac","entry":"quaternion_distance_est","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/cameras/camera_utils.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/cameras/camera_utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"22103dda822713ac"}},{"code_sha256_prefix":"2a37a4263e5911c2","entry":"quaternion_from_matrix","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/cameras/camera_utils.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/cameras/camera_utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"2a37a4263e5911c2"}},{"code_sha256_prefix":"57acaa6d628ba9f8","entry":"random_quat_tensor","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/models/gstex.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/models/gstex.py","link_basis":"harvester_set","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"57acaa6d628ba9f8"}},{"code_sha256_prefix":"34a1673bf755a59b","entry":"ray_samples_to_sdist","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/model_components/losses.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/model_components/losses.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"34a1673bf755a59b"}},{"code_sha256_prefix":"06036a2535dc9b18","entry":"sort_methods","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/configs/method_configs.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/configs/method_configs.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"06036a2535dc9b18"}},{"code_sha256_prefix":"025fd27a6a49f3a2","entry":"texture_dims_to_int_coords","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/models/jagged_texture.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/models/jagged_texture.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"025fd27a6a49f3a2"}},{"code_sha256_prefix":"7c3d8ce61e01c24b","entry":"texture_dims_to_query","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/models/jagged_texture.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/models/jagged_texture.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"7c3d8ce61e01c24b"}},{"code_sha256_prefix":"7fe44f700a2d1518","entry":"unit_vector","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/cameras/camera_utils.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/cameras/camera_utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"7fe44f700a2d1518"}},{"code_sha256_prefix":"492a1d8322c88716","entry":"three_js_perspective_camera_focal_length","repo":"victor-rong/gstex","repo_kind":"official","path":"nerfstudio/cameras/camera_paths.py","file_url":"https://github.com/victor-rong/gstex/blob/HEAD/nerfstudio/cameras/camera_paths.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"492a1d8322c88716"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}